diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 679d22906..605eca11f 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -8,7 +8,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- php: ['5.6', '7.0', '7.1', '7.2', '7.3', '7.4', '8.0', '8.1', '8.2']
+ php: ['5.6', '7.0', '7.1', '7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3']
name: Run tests against php ${{matrix.php}}
steps:
- name: Checkout
@@ -20,7 +20,7 @@ jobs:
PHP_VERSION: ${{matrix.php}}
- name: Composer Install
- run: docker-compose -f docker-compose.yml run -e PHP_VERSION=${{matrix.php}} test_runner composer update
+ run: docker-compose -f docker-compose.yml run -e PHP_VERSION=${{matrix.php}} test_runner composer install
env:
PHP_VERSION: ${{matrix.php}}
@@ -50,4 +50,4 @@ jobs:
run: docker-compose -f docker-compose.yml run test_runner vendor/bin/phpunit --testsuite Structure
- name: run cs fixer
- run: docker-compose -f docker-compose.yml run test_runner composer cs
+ run: docker-compose -f docker-compose.yml run -e PHP_CS_FIXER_IGNORE_ENV=true test_runner composer cs
diff --git a/.gitignore b/.gitignore
index bc8b7a41d..d55334171 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,7 +16,6 @@ phpunit.xml
# Composer
vendor
-composer.lock
.php_cs.cache
.phpunit.result.cache
diff --git a/Core/Core.php b/Core/Core.php
index 7e4d5b5ac..6cdbecb38 100755
--- a/Core/Core.php
+++ b/Core/Core.php
@@ -166,6 +166,16 @@ function str_ends_with(string $haystack, string $needle): bool {}
#[Pure]
function str_contains(string $haystack, string $needle): bool {}
+/**
+ * @since 8.3
+ */
+function str_decrement(string $string): string {}
+
+/**
+ * @since 8.3
+ */
+function str_increment(string $string): string {}
+
/**
* Return the current key and value pair from an array and advance the array cursor
* @link https://php.net/manual/en/function.each.php
diff --git a/Core/Core_c.php b/Core/Core_c.php
index 696095752..07be080d3 100644
--- a/Core/Core_c.php
+++ b/Core/Core_c.php
@@ -606,8 +606,8 @@ public function __construct(
#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $message = "",
#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $code = 0,
#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $severity = 1,
- #[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $filename = __FILE__,
- #[LanguageLevelTypeAware(['8.0' => 'int|null'], default: '')] $line = __LINE__,
+ #[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $filename = null,
+ #[LanguageLevelTypeAware(['8.0' => 'int|null'], default: '')] $line = null,
#[LanguageLevelTypeAware(['8.0' => 'Throwable|null'], default: 'Throwable')] $previous = null
) {}
@@ -795,7 +795,7 @@ public function offsetUnset($object): void {}
/**
* Returns an iterator in the "[object => mixed]" format.
*
- * @return Traversable
diff --git a/PhpStormStubsMap.php b/PhpStormStubsMap.php
index 9ad0cd98b..19ae1c3f3 100644
--- a/PhpStormStubsMap.php
+++ b/PhpStormStubsMap.php
@@ -9,6 +9,8 @@
*/
final class PhpStormStubsMap
{
+const DIR = __DIR__;
+
const CLASSES = array (
'AMQPBasicProperties' => 'amqp/amqp.php',
'AMQPChannel' => 'amqp/amqp.php',
@@ -416,8 +418,17 @@ final class PhpStormStubsMap
'DOMUserDataHandler' => 'dom/dom_c.php',
'DOMXPath' => 'dom/dom_c.php',
'DOTNET' => 'com_dotnet/com_dotnet.php',
+ 'DateError' => 'date/date_c.php',
+ 'DateException' => 'date/date_c.php',
'DateInterval' => 'date/date_c.php',
+ 'DateInvalidOperationException' => 'date/date_c.php',
+ 'DateInvalidTimeZoneException' => 'date/date_c.php',
+ 'DateMalformedIntervalStringException' => 'date/date_c.php',
+ 'DateMalformedPeriodStringException' => 'date/date_c.php',
+ 'DateMalformedStringException' => 'date/date_c.php',
+ 'DateObjectError' => 'date/date_c.php',
'DatePeriod' => 'date/date_c.php',
+ 'DateRangeError' => 'date/date_c.php',
'DateTime' => 'date/date_c.php',
'DateTimeImmutable' => 'date/date_c.php',
'DateTimeInterface' => 'date/date_c.php',
@@ -748,6 +759,7 @@ final class PhpStormStubsMap
'OutOfRangeException' => 'SPL/SPL.php',
'OuterIterator' => 'SPL/SPL.php',
'OverflowException' => 'SPL/SPL.php',
+ 'Override' => 'Core/Core_c.php',
'OwsrequestObj' => 'mapscript/mapscript.php',
'PDFlib' => 'pdflib/PDFlib.php',
'PDO' => 'PDO/PDO.php',
@@ -786,6 +798,7 @@ final class PhpStormStubsMap
'Random\\Engine\\PcgOneseq128XslRr64' => 'random/random.php',
'Random\\Engine\\Secure' => 'random/random.php',
'Random\\Engine\\Xoshiro256StarStar' => 'random/random.php',
+ 'Random\\IntervalBoundary' => 'random/random.php',
'Random\\RandomError' => 'random/random.php',
'Random\\RandomException' => 'random/random.php',
'Random\\Randomizer' => 'random/random.php',
@@ -859,12 +872,14 @@ final class PhpStormStubsMap
'Relay\\KeyType' => 'relay/KeyType.php',
'Relay\\Relay' => 'relay/Relay.php',
'Relay\\Sentinel' => 'relay/Sentinel.php',
+ 'Relay\\Table' => 'relay/Table.php',
'ResourceBundle' => 'intl/intl.php',
'ReturnTypeWillChange' => 'Core/Core_c.php',
'RuntimeException' => 'SPL/SPL.php',
'SNMP' => 'snmp/snmp.php',
'SNMPException' => 'snmp/snmp.php',
'SQLite3' => 'sqlite3/sqlite3.php',
+ 'SQLite3Exception' => 'sqlite3/sqlite3.php',
'SQLite3Result' => 'sqlite3/sqlite3.php',
'SQLite3Stmt' => 'sqlite3/sqlite3.php',
'SQLiteDatabase' => 'SQLite/SQLite.php',
@@ -1384,6 +1399,7 @@ final class PhpStormStubsMap
'MongoDB\\BSON\\toRelaxedExtendedJSON' => 'mongodb/BSON/functions.php',
'MongoDB\\Driver\\Monitoring\\addSubscriber' => 'mongodb/Monitoring/functions.php',
'MongoDB\\Driver\\Monitoring\\removeSubscriber' => 'mongodb/Monitoring/functions.php',
+ 'OpenTelemetry\\Instrumentation\\hook' => 'opentelemetry/opentelemetry.php',
'PDF_activate_item' => 'pdflib/PDFlib.php',
'PDF_add_launchlink' => 'pdflib/PDFlib.php',
'PDF_add_locallink' => 'pdflib/PDFlib.php',
@@ -3365,6 +3381,7 @@ final class PhpStormStubsMap
'json_encode' => 'json/json.php',
'json_last_error' => 'json/json.php',
'json_last_error_msg' => 'json/json.php',
+ 'json_validate' => 'json/json.php',
'juliantojd' => 'calendar/calendar.php',
'kafka_err2name' => 'simple_kafka_client/functions.php',
'kafka_err2str' => 'simple_kafka_client/functions.php',
@@ -3401,6 +3418,7 @@ final class PhpStormStubsMap
'ldap_exop' => 'ldap/ldap.php',
'ldap_exop_passwd' => 'ldap/ldap.php',
'ldap_exop_refresh' => 'ldap/ldap.php',
+ 'ldap_exop_sync' => 'ldap/ldap.php',
'ldap_exop_whoami' => 'ldap/ldap.php',
'ldap_explode_dn' => 'ldap/ldap.php',
'ldap_first_attribute' => 'ldap/ldap.php',
@@ -3729,6 +3747,7 @@ final class PhpStormStubsMap
'mb_scrub' => 'mbstring/mbstring.php',
'mb_send_mail' => 'mbstring/mbstring.php',
'mb_split' => 'mbstring/mbstring.php',
+ 'mb_str_pad' => 'mbstring/mbstring.php',
'mb_str_split' => 'mbstring/mbstring.php',
'mb_strcut' => 'mbstring/mbstring.php',
'mb_strimwidth' => 'mbstring/mbstring.php',
@@ -4655,6 +4674,7 @@ final class PhpStormStubsMap
'pg_dbname' => 'pgsql/pgsql.php',
'pg_delete' => 'pgsql/pgsql.php',
'pg_end_copy' => 'pgsql/pgsql.php',
+ 'pg_enter_pipeline_mode' => 'pgsql/pgsql.php',
'pg_errormessage' => 'pgsql/pgsql.php',
'pg_escape_bytea' => 'pgsql/pgsql.php',
'pg_escape_identifier' => 'pgsql/pgsql.php',
@@ -4662,6 +4682,7 @@ final class PhpStormStubsMap
'pg_escape_string' => 'pgsql/pgsql.php',
'pg_exec' => 'pgsql/pgsql.php',
'pg_execute' => 'pgsql/pgsql.php',
+ 'pg_exit_pipeline_mode' => 'pgsql/pgsql.php',
'pg_fetch_all' => 'pgsql/pgsql.php',
'pg_fetch_all_columns' => 'pgsql/pgsql.php',
'pg_fetch_array' => 'pgsql/pgsql.php',
@@ -4725,6 +4746,8 @@ final class PhpStormStubsMap
'pg_parameter_status' => 'pgsql/pgsql.php',
'pg_pconnect' => 'pgsql/pgsql.php',
'pg_ping' => 'pgsql/pgsql.php',
+ 'pg_pipeline_status' => 'pgsql/pgsql.php',
+ 'pg_pipeline_sync' => 'pgsql/pgsql.php',
'pg_port' => 'pgsql/pgsql.php',
'pg_prepare' => 'pgsql/pgsql.php',
'pg_put_line' => 'pgsql/pgsql.php',
@@ -4741,6 +4764,7 @@ final class PhpStormStubsMap
'pg_send_query' => 'pgsql/pgsql.php',
'pg_send_query_params' => 'pgsql/pgsql.php',
'pg_set_client_encoding' => 'pgsql/pgsql.php',
+ 'pg_set_error_context_visibility' => 'pgsql/pgsql.php',
'pg_set_error_verbosity' => 'pgsql/pgsql.php',
'pg_setclientencoding' => 'pgsql/pgsql.php',
'pg_socket' => 'pgsql/pgsql.php',
@@ -4779,6 +4803,7 @@ final class PhpStormStubsMap
'pos' => 'standard/standard_9.php',
'posix_access' => 'posix/posix.php',
'posix_ctermid' => 'posix/posix.php',
+ 'posix_eaccess' => 'posix/posix.php',
'posix_errno' => 'posix/posix.php',
'posix_get_last_error' => 'posix/posix.php',
'posix_getcwd' => 'posix/posix.php',
@@ -4811,6 +4836,7 @@ final class PhpStormStubsMap
'posix_setsid' => 'posix/posix.php',
'posix_setuid' => 'posix/posix.php',
'posix_strerror' => 'posix/posix.php',
+ 'posix_sysconf' => 'posix/posix.php',
'posix_times' => 'posix/posix.php',
'posix_ttyname' => 'posix/posix.php',
'posix_uname' => 'posix/posix.php',
@@ -5048,6 +5074,7 @@ final class PhpStormStubsMap
'socket_addrinfo_connect' => 'sockets/sockets.php',
'socket_addrinfo_explain' => 'sockets/sockets.php',
'socket_addrinfo_lookup' => 'sockets/sockets.php',
+ 'socket_atmark' => 'sockets/sockets.php',
'socket_bind' => 'sockets/sockets.php',
'socket_clear_error' => 'sockets/sockets.php',
'socket_close' => 'sockets/sockets.php',
@@ -5399,8 +5426,10 @@ final class PhpStormStubsMap
'stomp_unsubscribe' => 'stomp/stomp.php',
'stomp_version' => 'stomp/stomp.php',
'str_contains' => 'Core/Core.php',
+ 'str_decrement' => 'Core/Core.php',
'str_ends_with' => 'Core/Core.php',
'str_getcsv' => 'standard/standard_2.php',
+ 'str_increment' => 'Core/Core.php',
'str_ireplace' => 'standard/standard_1.php',
'str_pad' => 'standard/standard_2.php',
'str_repeat' => 'standard/standard_1.php',
@@ -5425,6 +5454,7 @@ final class PhpStormStubsMap
'stream_context_get_params' => 'standard/standard_6.php',
'stream_context_set_default' => 'standard/standard_6.php',
'stream_context_set_option' => 'standard/standard_6.php',
+ 'stream_context_set_options' => 'standard/standard_6.php',
'stream_context_set_params' => 'standard/standard_6.php',
'stream_copy_to_stream' => 'standard/standard_6.php',
'stream_filter_append' => 'standard/standard_6.php',
@@ -6608,6 +6638,8 @@ final class PhpStormStubsMap
'CURLHSTS_READONLYFILE' => 'curl/curl_d.php',
'CURLINFO_APPCONNECT_TIME' => 'curl/curl_d.php',
'CURLINFO_APPCONNECT_TIME_T' => 'curl/curl_d.php',
+ 'CURLINFO_CAINFO' => 'curl/curl_d.php',
+ 'CURLINFO_CAPATH' => 'curl/curl_d.php',
'CURLINFO_CERTINFO' => 'curl/curl_d.php',
'CURLINFO_CONDITION_UNMET' => 'curl/curl_d.php',
'CURLINFO_CONNECT_TIME' => 'curl/curl_d.php',
@@ -6672,6 +6704,11 @@ final class PhpStormStubsMap
'CURLINFO_STARTTRANSFER_TIME_T' => 'curl/curl_d.php',
'CURLINFO_TOTAL_TIME' => 'curl/curl_d.php',
'CURLINFO_TOTAL_TIME_T' => 'curl/curl_d.php',
+ 'CURLKHMATCH_LAST' => 'curl/curl_d.php',
+ 'CURLKHMATCH_MISMATCH' => 'curl/curl_d.php',
+ 'CURLKHMATCH_MISSING' => 'curl/curl_d.php',
+ 'CURLKHMATCH_OK' => 'curl/curl_d.php',
+ 'CURLMIMEOPT_FORMESCAPE' => 'curl/curl_d.php',
'CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE' => 'curl/curl_d.php',
'CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE' => 'curl/curl_d.php',
'CURLMOPT_MAXCONNECTS' => 'curl/curl_d.php',
@@ -6703,6 +6740,7 @@ final class PhpStormStubsMap
'CURLOPT_CAINFO' => 'curl/curl_d.php',
'CURLOPT_CAINFO_BLOB' => 'curl/curl_d.php',
'CURLOPT_CAPATH' => 'curl/curl_d.php',
+ 'CURLOPT_CA_CACHE_TIMEOUT' => 'curl/curl_d.php',
'CURLOPT_CERTINFO' => 'curl/curl_d.php',
'CURLOPT_CLOSEPOLICY' => 'curl/curl_d.php',
'CURLOPT_CONNECTTIMEOUT' => 'curl/curl_d.php',
@@ -6802,6 +6840,7 @@ final class PhpStormStubsMap
'CURLOPT_MAXREDIRS' => 'curl/curl_d.php',
'CURLOPT_MAX_RECV_SPEED_LARGE' => 'curl/curl_d.php',
'CURLOPT_MAX_SEND_SPEED_LARGE' => 'curl/curl_d.php',
+ 'CURLOPT_MIME_OPTIONS' => 'curl/curl_d.php',
'CURLOPT_MUTE' => 'curl/curl_d.php',
'CURLOPT_NETRC' => 'curl/curl_d.php',
'CURLOPT_NETRC_FILE' => 'curl/curl_d.php',
@@ -6826,6 +6865,7 @@ final class PhpStormStubsMap
'CURLOPT_PRIVATE' => 'curl/curl_d.php',
'CURLOPT_PROGRESSFUNCTION' => 'curl/curl_d.php',
'CURLOPT_PROTOCOLS' => 'curl/curl_d.php',
+ 'CURLOPT_PROTOCOLS_STR' => 'curl/curl_d.php',
'CURLOPT_PROXY' => 'curl/curl_d.php',
'CURLOPT_PROXYAUTH' => 'curl/curl_d.php',
'CURLOPT_PROXYHEADER' => 'curl/curl_d.php',
@@ -6860,12 +6900,14 @@ final class PhpStormStubsMap
'CURLOPT_PROXY_TLSAUTH_USERNAME' => 'curl/curl_d.php',
'CURLOPT_PROXY_TRANSFER_MODE' => 'curl/curl_d.php',
'CURLOPT_PUT' => 'curl/curl_d.php',
+ 'CURLOPT_QUICK_EXIT' => 'curl/curl_d.php',
'CURLOPT_QUOTE' => 'curl/curl_d.php',
'CURLOPT_RANDOM_FILE' => 'curl/curl_d.php',
'CURLOPT_RANGE' => 'curl/curl_d.php',
'CURLOPT_READDATA' => 'curl/curl_d.php',
'CURLOPT_READFUNCTION' => 'curl/curl_d.php',
'CURLOPT_REDIR_PROTOCOLS' => 'curl/curl_d.php',
+ 'CURLOPT_REDIR_PROTOCOLS_STR' => 'curl/curl_d.php',
'CURLOPT_REFERER' => 'curl/curl_d.php',
'CURLOPT_REQUEST_TARGET' => 'curl/curl_d.php',
'CURLOPT_RESOLVE' => 'curl/curl_d.php',
@@ -6887,6 +6929,7 @@ final class PhpStormStubsMap
'CURLOPT_SOCKS5_GSSAPI_SERVICE' => 'curl/curl_d.php',
'CURLOPT_SSH_AUTH_TYPES' => 'curl/curl_d.php',
'CURLOPT_SSH_COMPRESSION' => 'curl/curl_d.php',
+ 'CURLOPT_SSH_HOSTKEYFUNCTION' => 'curl/curl_d.php',
'CURLOPT_SSH_HOST_PUBLIC_KEY_MD5' => 'curl/curl_d.php',
'CURLOPT_SSH_HOST_PUBLIC_KEY_SHA256' => 'curl/curl_d.php',
'CURLOPT_SSH_KNOWNHOSTS' => 'curl/curl_d.php',
@@ -6949,6 +6992,7 @@ final class PhpStormStubsMap
'CURLOPT_WILDCARDMATCH' => 'curl/curl_d.php',
'CURLOPT_WRITEFUNCTION' => 'curl/curl_d.php',
'CURLOPT_WRITEHEADER' => 'curl/curl_d.php',
+ 'CURLOPT_WS_OPTIONS' => 'curl/curl_d.php',
'CURLOPT_XFERINFOFUNCTION' => 'curl/curl_d.php',
'CURLOPT_XOAUTH2_BEARER' => 'curl/curl_d.php',
'CURLPAUSE_ALL' => 'curl/curl_d.php',
@@ -7054,6 +7098,7 @@ final class PhpStormStubsMap
'CURLUSESSL_NONE' => 'curl/curl_d.php',
'CURLUSESSL_TRY' => 'curl/curl_d.php',
'CURLVERSION_NOW' => 'curl/curl_d.php',
+ 'CURLWS_RAW_MODE' => 'curl/curl_d.php',
'CURL_FNMATCHFUNC_FAIL' => 'curl/curl_d.php',
'CURL_FNMATCHFUNC_MATCH' => 'curl/curl_d.php',
'CURL_FNMATCHFUNC_NOMATCH' => 'curl/curl_d.php',
@@ -8240,9 +8285,17 @@ final class PhpStormStubsMap
'IPV6_TCLASS' => 'sockets/sockets.php',
'IPV6_UNICAST_HOPS' => 'sockets/sockets.php',
'IPV6_V6ONLY' => 'sockets/sockets.php',
+ 'IP_BIND_ADDRESS_NO_PORT' => 'sockets/sockets.php',
+ 'IP_MTU_DISCOVER' => 'sockets/sockets.php',
'IP_MULTICAST_IF' => 'sockets/sockets.php',
'IP_MULTICAST_LOOP' => 'sockets/sockets.php',
'IP_MULTICAST_TTL' => 'sockets/sockets.php',
+ 'IP_PMTUDISC_DO' => 'sockets/sockets.php',
+ 'IP_PMTUDISC_DONT' => 'sockets/sockets.php',
+ 'IP_PMTUDISC_INTERFACE' => 'sockets/sockets.php',
+ 'IP_PMTUDISC_OMIT' => 'sockets/sockets.php',
+ 'IP_PMTUDISC_PROBE' => 'sockets/sockets.php',
+ 'IP_PMTUDISC_WANT' => 'sockets/sockets.php',
'ImageButton' => 'winbinder/winbinder.php',
'InvisibleArea' => 'winbinder/winbinder.php',
'JOB_QUEUE_PRIORITY_HIGH' => 'zend/zend_d.php',
@@ -10536,6 +10589,7 @@ final class PhpStormStubsMap
'OPENSSL_CMS_NOINTERN' => 'openssl/openssl.php',
'OPENSSL_CMS_NOSIGS' => 'openssl/openssl.php',
'OPENSSL_CMS_NOVERIFY' => 'openssl/openssl.php',
+ 'OPENSSL_CMS_OLDMIMETYPE' => 'openssl/openssl.php',
'OPENSSL_CMS_TEXT' => 'openssl/openssl.php',
'OPENSSL_DEFAULT_STREAM_CIPHERS' => 'openssl/openssl.php',
'OPENSSL_DONT_ZERO_PAD_KEY' => 'openssl/openssl.php',
@@ -10663,6 +10717,7 @@ final class PhpStormStubsMap
'PGSQL_DML_STRING' => 'pgsql/pgsql.php',
'PGSQL_EMPTY_QUERY' => 'pgsql/pgsql.php',
'PGSQL_ERRORS_DEFAULT' => 'pgsql/pgsql.php',
+ 'PGSQL_ERRORS_SQLSTATE' => 'pgsql/pgsql.php',
'PGSQL_ERRORS_TERSE' => 'pgsql/pgsql.php',
'PGSQL_ERRORS_VERBOSE' => 'pgsql/pgsql.php',
'PGSQL_FATAL_ERROR' => 'pgsql/pgsql.php',
@@ -10673,6 +10728,10 @@ final class PhpStormStubsMap
'PGSQL_NOTICE_CLEAR' => 'pgsql/pgsql.php',
'PGSQL_NOTICE_LAST' => 'pgsql/pgsql.php',
'PGSQL_NUM' => 'pgsql/pgsql.php',
+ 'PGSQL_PIPELINE_ABORTED' => 'pgsql/pgsql.php',
+ 'PGSQL_PIPELINE_OFF' => 'pgsql/pgsql.php',
+ 'PGSQL_PIPELINE_ON' => 'pgsql/pgsql.php',
+ 'PGSQL_PIPELINE_SYNC' => 'pgsql/pgsql.php',
'PGSQL_POLLING_ACTIVE' => 'pgsql/pgsql.php',
'PGSQL_POLLING_FAILED' => 'pgsql/pgsql.php',
'PGSQL_POLLING_OK' => 'pgsql/pgsql.php',
@@ -10681,8 +10740,12 @@ final class PhpStormStubsMap
'PGSQL_SEEK_CUR' => 'pgsql/pgsql.php',
'PGSQL_SEEK_END' => 'pgsql/pgsql.php',
'PGSQL_SEEK_SET' => 'pgsql/pgsql.php',
+ 'PGSQL_SHOW_CONTEXT_ALWAYS' => 'pgsql/pgsql.php',
+ 'PGSQL_SHOW_CONTEXT_ERRORS' => 'pgsql/pgsql.php',
+ 'PGSQL_SHOW_CONTEXT_NEVER' => 'pgsql/pgsql.php',
'PGSQL_STATUS_LONG' => 'pgsql/pgsql.php',
'PGSQL_STATUS_STRING' => 'pgsql/pgsql.php',
+ 'PGSQL_TRACE_REGRESS_MODE' => 'pgsql/pgsql.php',
'PGSQL_TRANSACTION_ACTIVE' => 'pgsql/pgsql.php',
'PGSQL_TRANSACTION_IDLE' => 'pgsql/pgsql.php',
'PGSQL_TRANSACTION_INERROR' => 'pgsql/pgsql.php',
@@ -10776,6 +10839,7 @@ final class PhpStormStubsMap
'PKCS7_NOCERTS' => 'openssl/openssl.php',
'PKCS7_NOCHAIN' => 'openssl/openssl.php',
'PKCS7_NOINTERN' => 'openssl/openssl.php',
+ 'PKCS7_NOOLDMIMETYPE' => 'openssl/openssl.php',
'PKCS7_NOSIGS' => 'openssl/openssl.php',
'PKCS7_NOVERIFY' => 'openssl/openssl.php',
'PKCS7_TEXT' => 'openssl/openssl.php',
@@ -10795,6 +10859,16 @@ final class PhpStormStubsMap
'POLL_PRI' => 'pcntl/pcntl.php',
'POSITIVE_SIGN' => 'standard/standard_defines.php',
'POSIX_F_OK' => 'posix/posix.php',
+ 'POSIX_PC_ALLOC_SIZE_MIN' => 'posix/posix.php',
+ 'POSIX_PC_CHOWN_RESTRICTED' => 'posix/posix.php',
+ 'POSIX_PC_LINK_MAX' => 'posix/posix.php',
+ 'POSIX_PC_MAX_CANON' => 'posix/posix.php',
+ 'POSIX_PC_MAX_INPUT' => 'posix/posix.php',
+ 'POSIX_PC_NAME_MAX' => 'posix/posix.php',
+ 'POSIX_PC_NO_TRUNC' => 'posix/posix.php',
+ 'POSIX_PC_PATH_MAX' => 'posix/posix.php',
+ 'POSIX_PC_PIPE_BUF' => 'posix/posix.php',
+ 'POSIX_PC_SYMLINK_MAX' => 'posix/posix.php',
'POSIX_RLIMIT_AS' => 'posix/posix.php',
'POSIX_RLIMIT_CORE' => 'posix/posix.php',
'POSIX_RLIMIT_CPU' => 'posix/posix.php',
@@ -10813,6 +10887,10 @@ final class PhpStormStubsMap
'POSIX_RLIMIT_SIGPENDING' => 'posix/posix.php',
'POSIX_RLIMIT_STACK' => 'posix/posix.php',
'POSIX_R_OK' => 'posix/posix.php',
+ 'POSIX_SC_ARG_MAX' => 'posix/posix.php',
+ 'POSIX_SC_NPROCESSORS_CONF' => 'posix/posix.php',
+ 'POSIX_SC_NPROCESSORS_ONLN' => 'posix/posix.php',
+ 'POSIX_SC_PAGESIZE' => 'posix/posix.php',
'POSIX_S_IFBLK' => 'posix/posix.php',
'POSIX_S_IFCHR' => 'posix/posix.php',
'POSIX_S_IFIFO' => 'posix/posix.php',
@@ -11871,6 +11949,7 @@ final class PhpStormStubsMap
'SOL_SOCKET' => 'sockets/sockets.php',
'SOL_TCP' => 'sockets/sockets.php',
'SOL_UDP' => 'sockets/sockets.php',
+ 'SOL_UDPLITE' => 'sockets/sockets.php',
'SOMAXCONN' => 'sockets/sockets.php',
'SORTARRIVAL' => 'imap/imap.php',
'SORTCC' => 'imap/imap.php',
@@ -11887,10 +11966,13 @@ final class PhpStormStubsMap
'SORT_NUMERIC' => 'standard/standard_defines.php',
'SORT_REGULAR' => 'standard/standard_defines.php',
'SORT_STRING' => 'standard/standard_defines.php',
+ 'SO_ATTACH_REUSEPORT_CBPF' => 'sockets/sockets.php',
'SO_BINDTODEVICE' => 'sockets/sockets.php',
'SO_BPF_EXTENSIONS' => 'sockets/sockets.php',
'SO_BROADCAST' => 'sockets/sockets.php',
'SO_DEBUG' => 'sockets/sockets.php',
+ 'SO_DETACH_BPF' => 'sockets/sockets.php',
+ 'SO_DETACH_FILTER' => 'sockets/sockets.php',
'SO_DONTROUTE' => 'sockets/sockets.php',
'SO_ERROR' => 'sockets/sockets.php',
'SO_FREE' => 'imap/imap.php',
@@ -12794,6 +12876,8 @@ final class PhpStormStubsMap
'TCP_KEEPINTVL' => 'sockets/sockets.php',
'TCP_NODELAY' => 'sockets/sockets.php',
'TCP_NOTSENT_LOWAT' => 'sockets/sockets.php',
+ 'TCP_QUICKACK' => 'sockets/sockets.php',
+ 'TCP_REPAIR' => 'sockets/sockets.php',
'THOUSANDS_SEP' => 'standard/standard_defines.php',
'THOUSEP' => 'standard/standard_defines.php',
'TIDY_NODETYPE_ASP' => 'tidy/tidy.php',
diff --git a/Reflection/ReflectionClass.php b/Reflection/ReflectionClass.php
index 554c1fa92..78677a763 100644
--- a/Reflection/ReflectionClass.php
+++ b/Reflection/ReflectionClass.php
@@ -278,7 +278,7 @@ public function getReflectionConstant(string $name): ReflectionClassConstant|fal
*/
#[Pure]
#[TentativeType]
- public function getReflectionConstants(#[PhpStormStubsElementAvailable(from: '8.0')] ?int $filter = ReflectionClassConstant::IS_PUBLIC|ReflectionClassConstant::IS_PROTECTED|ReflectionClassConstant::IS_PRIVATE): array {}
+ public function getReflectionConstants(#[PhpStormStubsElementAvailable(from: '8.0')] ?int $filter = null): array {}
/**
* Checks if constant is defined
@@ -300,7 +300,7 @@ public function hasConstant(#[LanguageLevelTypeAware(['8.0' => 'string'], defaul
*/
#[Pure]
#[TentativeType]
- public function getConstants(#[PhpStormStubsElementAvailable(from: '8.0')] ?int $filter = ReflectionClassConstant::IS_PUBLIC|ReflectionClassConstant::IS_PROTECTED|ReflectionClassConstant::IS_PRIVATE): array {}
+ public function getConstants(#[PhpStormStubsElementAvailable(from: '8.0')] ?int $filter = null): array {}
/**
* Gets defined constant
@@ -525,14 +525,15 @@ public function isSubclassOf(#[LanguageLevelTypeAware(['8.0' => 'ReflectionClass
*/
#[Pure]
#[TentativeType]
- public function getStaticProperties(): ?array {}
+ #[LanguageLevelTypeAware(['8.3' => 'array'], default: 'array|null')]
+ public function getStaticProperties() {}
/**
* Gets static property value
*
* @link https://php.net/manual/en/reflectionclass.getstaticpropertyvalue.php
* @param string $name The name of the static property for which to return a value.
- * @param mixed $default A default value to return in case the class does
+ * @param mixed $default [optional] A default value to return in case the class does
* not declare a static property with the given name. If the property does
* not exist and this argument is omitted, a {@see ReflectionException} is thrown.
* @return mixed The value of the static property.
@@ -541,7 +542,7 @@ public function getStaticProperties(): ?array {}
#[TentativeType]
public function getStaticPropertyValue(
#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $name,
- #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $default = null
+ #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $default
): mixed {}
/**
diff --git a/Reflection/ReflectionClassConstant.php b/Reflection/ReflectionClassConstant.php
index d2f3d3c4c..a75bda616 100644
--- a/Reflection/ReflectionClassConstant.php
+++ b/Reflection/ReflectionClassConstant.php
@@ -220,4 +220,14 @@ public function isEnumCase(): bool {}
* @since 8.1
*/
public function isFinal(): bool {}
+
+ /**
+ * @since 8.3
+ */
+ public function hasType(): bool {}
+
+ /**
+ * @since 8.3
+ */
+ public function getType(): ?ReflectionType {}
}
diff --git a/Reflection/ReflectionMethod.php b/Reflection/ReflectionMethod.php
index da59e0338..72da0035b 100644
--- a/Reflection/ReflectionMethod.php
+++ b/Reflection/ReflectionMethod.php
@@ -301,4 +301,9 @@ public function setAccessible(bool $accessible): void {}
#[PhpStormStubsElementAvailable(from: '8.2')]
public function hasPrototype(): bool {}
+
+ /**
+ * @since 8.3
+ */
+ public static function createFromMethodName(string $method): static {}
}
diff --git a/Reflection/ReflectionProperty.php b/Reflection/ReflectionProperty.php
index f770f1f5d..642d4d9b3 100644
--- a/Reflection/ReflectionProperty.php
+++ b/Reflection/ReflectionProperty.php
@@ -130,13 +130,13 @@ public function getValue(#[LanguageLevelTypeAware(['8.0' => 'object|null'], defa
* @param mixed $objectOrValue If the property is non-static an object must
* be provided to change the property on. If the property is static this
* parameter is left out and only $value needs to be provided.
- * @param mixed $value The new value.
+ * @param mixed $value [optional] The new value.
* @return void No value is returned.
*/
#[TentativeType]
public function setValue(
#[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $objectOrValue,
- #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $value = null
+ #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $value
): void {}
/**
diff --git a/SPL/SPL.php b/SPL/SPL.php
index 4353bb7d4..abc3a6619 100644
--- a/SPL/SPL.php
+++ b/SPL/SPL.php
@@ -447,7 +447,7 @@ class IteratorIterator implements OuterIterator
* @param Traversable $iterator
* @param string|null $class [optional]
*/
- public function __construct(Traversable $iterator, #[PhpStormStubsElementAvailable(from: '8.0')] ?string $class = '') {}
+ public function __construct(Traversable $iterator, #[PhpStormStubsElementAvailable(from: '8.0')] ?string $class = null) {}
/**
* Get the inner iterator
@@ -935,7 +935,7 @@ class RecursiveCachingIterator extends CachingIterator implements RecursiveItera
* @param Iterator $iterator The iterator to cache.
* @param int $flags [optional] A bitmask of flags. See CachingIterator class constants for details.
*/
- public function __construct(Iterator $iterator, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $flags = self::CALL_TOSTRING) {}
+ public function __construct(Iterator $iterator, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $flags = CachingIterator::CALL_TOSTRING) {}
/**
* Check whether the current element of the inner iterator has children
@@ -1336,7 +1336,7 @@ class RecursiveRegexIterator extends RegexIterator implements RecursiveIterator
public function __construct(
RecursiveIterator $iterator,
#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $pattern,
- #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $mode = self::MATCH,
+ #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $mode = RegexIterator::MATCH,
#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $flags = 0,
#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $pregFlags = 0
) {}
@@ -1385,7 +1385,7 @@ public function __construct(
$iterator,
#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $flags = self::BYPASS_KEY,
#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $cachingIteratorFlags = CachingIterator::CATCH_GET_CHILD,
- #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $mode = self::SELF_FIRST
+ #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $mode = RecursiveIteratorIterator::SELF_FIRST
) {}
/**
@@ -1683,20 +1683,18 @@ public function setFlags(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')
/**
* Sort the entries by value
* @link https://php.net/manual/en/arrayobject.asort.php
- * @param int $flags [optional]
- * @return bool
*/
#[TentativeType]
- public function asort(#[PhpStormStubsElementAvailable(from: '8.0')] int $flags = SORT_REGULAR): bool {}
+ #[LanguageLevelTypeAware(['8.3' => 'true'], default: 'bool')]
+ public function asort(#[PhpStormStubsElementAvailable(from: '8.0')] int $flags = SORT_REGULAR) {}
/**
* Sort the entries by key
* @link https://php.net/manual/en/arrayobject.ksort.php
- * @param int $flags [optional]
- * @return bool
*/
#[TentativeType]
- public function ksort(#[PhpStormStubsElementAvailable(from: '8.0')] int $flags = SORT_REGULAR): bool {}
+ #[LanguageLevelTypeAware(['8.3' => 'true'], default: 'bool')]
+ public function ksort(#[PhpStormStubsElementAvailable(from: '8.0')] int $flags = SORT_REGULAR) {}
/**
* Sort the entries with a user-defined comparison function and maintain key association
@@ -1709,10 +1707,10 @@ public function ksort(#[PhpStormStubsElementAvailable(from: '8.0')] int $flags =
* be respectively less than, equal to, or greater than the
* second.
*
* The compare function used for the sort. *
- * @return void */ #[TentativeType] - public function uasort(#[LanguageLevelTypeAware(['8.0' => 'callable'], default: '')] $callback): bool {} + #[LanguageLevelTypeAware(['8.3' => 'true'], default: 'bool')] + public function uasort(#[LanguageLevelTypeAware(['8.0' => 'callable'], default: '')] $callback) {} /** * User defined sort @@ -1987,26 +1983,26 @@ public function uasort(#[LanguageLevelTypeAware(['8.0' => 'callable'], default: * @param callable $callback* The compare function used for the sort. *
- * @return void */ #[TentativeType] - public function uksort(#[LanguageLevelTypeAware(['8.0' => 'callable'], default: '')] $callback): bool {} + #[LanguageLevelTypeAware(['8.3' => 'true'], default: 'bool')] + public function uksort(#[LanguageLevelTypeAware(['8.0' => 'callable'], default: '')] $callback) {} /** * Sort an array naturally * @link https://php.net/manual/en/arrayiterator.natsort.php - * @return bool */ #[TentativeType] - public function natsort(): bool {} + #[LanguageLevelTypeAware(['8.3' => 'true'], default: 'bool')] + public function natsort() {} /** * Sort an array naturally, case insensitive * @link https://php.net/manual/en/arrayiterator.natcasesort.php - * @return bool */ #[TentativeType] - public function natcasesort(): bool {} + #[LanguageLevelTypeAware(['8.3' => 'true'], default: 'bool')] + public function natcasesort() {} /** * Unserialize diff --git a/SPL/SPL_c1.php b/SPL/SPL_c1.php index 010b8dcda..23815b60e 100644 --- a/SPL/SPL_c1.php +++ b/SPL/SPL_c1.php @@ -59,7 +59,7 @@ public function getExtension(): string {} * @since 5.2.2 */ #[TentativeType] - public function getBasename(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $suffix = null): string {} + public function getBasename(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $suffix = ''): string {} /** * Gets the path to the file @@ -889,7 +889,7 @@ public function fscanf( #[TentativeType] public function fwrite( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $data, - #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $length = null + #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $length = 0 ): int|false {} /** @@ -1372,7 +1372,7 @@ abstract class SplHeap implements Iterator, Countable /** * Extracts a node from top of the heap and sift up. * @link https://php.net/manual/en/splheap.extract.php - * @return mixed The value of the extracted node. + * @return TValue The value of the extracted node. */ #[TentativeType] public function extract(): mixed {} @@ -1531,7 +1531,7 @@ public function extract() {} * @param TValue $value* The value to insert. *
- * @return void + * @return true */ public function insert($value) {} diff --git a/composer.lock b/composer.lock new file mode 100644 index 000000000..7d97231b3 --- /dev/null +++ b/composer.lock @@ -0,0 +1,4035 @@ +{ + "_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": "ec72442e7a7b8890b4a3053a66ea2692", + "packages": [], + "packages-dev": [ + { + "name": "composer/pcre", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", + "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "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.1.0" + }, + "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": "2022-11-17T09:50:14+00:00" + }, + { + "name": "composer/semver", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "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": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.3.2" + }, + "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": "2022-04-01T19:23:25+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "ced299686f41dce890debac69273b47ffe98a40c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", + "reference": "ced299686f41dce890debac69273b47ffe98a40c", + "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", + "symfony/phpunit-bridge": "^6.0" + }, + "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": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.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": "2022-02-25T21:32:43+00:00" + }, + { + "name": "doctrine/annotations", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", + "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2 || ^3", + "ext-tokenizer": "*", + "php": "^7.2 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" + }, + "require-dev": { + "doctrine/cache": "^2.0", + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.8.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "symfony/cache": "^5.4 || ^6", + "vimeo/psalm": "^4.10" + }, + "suggest": { + "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "https://www.doctrine-project.org/projects/annotations.html", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/2.0.1" + }, + "time": "2023-02-02T22:02:53+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", + "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/v1.1.1" + }, + "time": "2023-06-03T09:27:29+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": "doctrine/lexer", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "84a527db05647743d50373e0ec53a152f2cde568" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/84a527db05647743d50373e0ec53a152f2cde568", + "reference": "84a527db05647743d50373e0ec53a152f2cde568", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.9", + "phpunit/phpunit": "^9.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.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%2Flexer", + "type": "tidelift" + } + ], + "time": "2022-12-15T16:57:16+00:00" + }, + { + "name": "friendsofphp/php-cs-fixer", + "version": "v3.17.0", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", + "reference": "3f0ed862f22386c55a767461ef5083bddceeed79" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/3f0ed862f22386c55a767461ef5083bddceeed79", + "reference": "3f0ed862f22386c55a767461ef5083bddceeed79", + "shasum": "" + }, + "require": { + "composer/semver": "^3.3", + "composer/xdebug-handler": "^3.0.3", + "doctrine/annotations": "^2", + "doctrine/lexer": "^2 || ^3", + "ext-json": "*", + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0", + "sebastian/diff": "^4.0 || ^5.0", + "symfony/console": "^5.4 || ^6.0", + "symfony/event-dispatcher": "^5.4 || ^6.0", + "symfony/filesystem": "^5.4 || ^6.0", + "symfony/finder": "^5.4 || ^6.0", + "symfony/options-resolver": "^5.4 || ^6.0", + "symfony/polyfill-mbstring": "^1.27", + "symfony/polyfill-php80": "^1.27", + "symfony/polyfill-php81": "^1.27", + "symfony/process": "^5.4 || ^6.0", + "symfony/stopwatch": "^5.4 || ^6.0" + }, + "require-dev": { + "justinrainbow/json-schema": "^5.2", + "keradus/cli-executor": "^2.0", + "mikey179/vfsstream": "^1.6.11", + "php-coveralls/php-coveralls": "^2.5.3", + "php-cs-fixer/accessible-object": "^1.1", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1", + "phpspec/prophecy": "^1.16", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.5", + "phpunitgoodpractices/polyfill": "^1.6", + "phpunitgoodpractices/traits": "^1.9.2", + "symfony/phpunit-bridge": "^6.2.3", + "symfony/yaml": "^5.4 || ^6.0" + }, + "suggest": { + "ext-dom": "For handling output formats in XML", + "ext-mbstring": "For handling non-UTF8 characters." + }, + "bin": [ + "php-cs-fixer" + ], + "type": "application", + "autoload": { + "psr-4": { + "PhpCsFixer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Dariusz RumiĆski", + "email": "dariusz.ruminski@gmail.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "keywords": [ + "Static code analysis", + "fixer", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.17.0" + }, + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } + ], + "time": "2023-05-22T19:59:32+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.15.5", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "11e2663a5bc9db5d714eedb4277ee300403b4a9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/11e2663a5bc9db5d714eedb4277ee300403b4a9e", + "reference": "11e2663a5bc9db5d714eedb4277ee300403b4a9e", + "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.15.5" + }, + "time": "2023-05-19T20:20:00+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": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.2", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" + }, + "time": "2021-10-19T17:43:47+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.7.2", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "b2fe4d22a5426f38e014855322200b97b5362c0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b2fe4d22a5426f38e014855322200b97b5362c0d", + "reference": "b2fe4d22a5426f38e014855322200b97b5362c0d", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.4 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.13" + }, + "require-dev": { + "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.7.2" + }, + "time": "2023-05-30T18:13:47+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "1.22.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "ec58baf7b3c7f1c81b3b00617c953249fb8cf30c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/ec58baf7b3c7f1c81b3b00617c953249fb8cf30c", + "reference": "ec58baf7b3c7f1c81b3b00617c953249fb8cf30c", + "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.22.0" + }, + "time": "2023-06-01T12:35:21+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "9.2.26", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", + "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", + "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", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.26" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-03-06T12:58:08+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.9", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "a9aceaf20a682aeacf28d582654a1670d8826778" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a9aceaf20a682aeacf28d582654a1670d8826778", + "reference": "a9aceaf20a682aeacf28d582654a1670d8826778", + "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.9" + }, + "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-06-11T06:13:56+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/log", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.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/3.0.0" + }, + "time": "2021-07-14T16:46:02+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.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "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.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-02-14T08:28:10+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": "symfony/console", + "version": "v6.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "8788808b07cf0bdd6e4b7fdd23d8ddb1470c83b7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/8788808b07cf0bdd6e4b7fdd23d8ddb1470c83b7", + "reference": "8788808b07cf0bdd6e4b7fdd23d8ddb1470c83b7", + "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.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-29T12:49:39+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.3.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.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/event-dispatcher", + "version": "v6.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "3af8ac1a3f98f6dbc55e10ae59c9e44bfc38dfaa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/3af8ac1a3f98f6dbc55e10ae59c9e44bfc38dfaa", + "reference": "3af8ac1a3f98f6dbc55e10ae59c9e44bfc38dfaa", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "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/error-handler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "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 tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/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-04-21T14:41:17+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "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\\EventDispatcher\\": "" + } + }, + "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 dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-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/filesystem", + "version": "v6.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "97b698e1d77d356304def77a8d0cd73090b359ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/97b698e1d77d356304def77a8d0cd73090b359ea", + "reference": "97b698e1d77d356304def77a8d0cd73090b359ea", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "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.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-30T17:12:32+00:00" + }, + { + "name": "symfony/finder", + "version": "v6.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "d9b01ba073c44cef617c7907ce2419f8d00d75e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/d9b01ba073c44cef617c7907ce2419f8d00d75e2", + "reference": "d9b01ba073c44cef617c7907ce2419f8d00d75e2", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.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.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-04-02T01:25:41+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.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/polyfill-php80", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "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\\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.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-php81", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "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\\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.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.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "8741e3ed7fe2e91ec099e02446fb86667a0f1628" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/8741e3ed7fe2e91ec099e02446fb86667a0f1628", + "reference": "8741e3ed7fe2e91ec099e02446fb86667a0f1628", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "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.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-19T08:06:44+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/stopwatch", + "version": "v6.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", + "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/service-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "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 a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/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-02-16T10:14:28+00:00" + }, + { + "name": "symfony/string", + "version": "v6.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "f2e190ee75ff0f5eced645ec0be5c66fac81f51f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/f2e190ee75ff0f5eced645ec0be5c66fac81f51f", + "reference": "f2e190ee75ff0f5eced645ec0be5c66fac81f51f", + "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.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-03-21T21:06:29+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" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "nikic/php-parser": 0, + "phpdocumentor/reflection-docblock": 0, + "friendsofphp/php-cs-fixer": 0 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": { + "php": "^8.0" + }, + "plugin-api-version": "2.3.0" +} diff --git a/curl/curl.php b/curl/curl.php index c3b7db346..2a8665079 100644 --- a/curl/curl.php +++ b/curl/curl.php @@ -27,8 +27,8 @@ class CURLFile */ public function __construct( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $filename, - #[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $mime_type = '', - #[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $posted_filename = '' + #[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $mime_type = null, + #[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $posted_filename = null ) {} /** @@ -2594,7 +2594,7 @@ function curl_close(#[LanguageLevelTypeAware(['8.0' => 'CurlHandle'], default: ' /** * Returns a new cURL multi handle * @link https://php.net/manual/en/function.curl-multi-init.php - * @return resource|CurlMultiHandle|false a cURL multi handle resource on success, false on failure. + * @return resource|CurlMultiHandle a cURL multi handle resource or object depends on the php version */ #[LanguageLevelTypeAware(['8.0' => 'CurlMultiHandle'], default: 'resource')] function curl_multi_init(): CurlMultiHandle {} diff --git a/curl/curl_d.php b/curl/curl_d.php index 233e564bc..52b15e8cf 100644 --- a/curl/curl_d.php +++ b/curl/curl_d.php @@ -1120,6 +1120,17 @@ * @since 5.2.4 */ define('CURLINFO_PRIVATE', 1048597); + +/** + * @since 8.3 + */ +define('CURLINFO_CAPATH', 1048638); + +/** + * @since 8.3 + */ +define('CURLINFO_CAINFO', 1048637); + /** * Supports IPv6 * @link https://php.net/manual/en/curl.constants.php @@ -1151,6 +1162,37 @@ * @link https://curl.haxx.se/libcurl/c/libcurl-errors.html */ define('CURLE_OK', 0); + +/** + * @since 8.3 + */ +define('CURLKHMATCH_OK', 0); + +/** + * @since 8.3 + */ +define('CURLKHMATCH_MISMATCH', 1); + +/** + * @since 8.3 + */ +define('CURLKHMATCH_MISSING', 2); + +/** + * @since 8.3 + */ +define('CURLKHMATCH_LAST', 3); + +/** + * @since 8.3 + */ +define('CURLOPT_MIME_OPTIONS', 315); + +/** + * @since 8.3 + */ +define('CURLMIMEOPT_FORMESCAPE', 1); + /** * The URL you passed to libcurl used a protocol that this libcurl does not support. * The support might be a compile-time option that you didn't use, @@ -2061,6 +2103,41 @@ */ define('CURLOPT_SERVICE_NAME', 10236); +/** + * @since 8.3 + */ +define('CURLOPT_SSH_HOSTKEYFUNCTION', 20316); + +/** + * @since 8.3 + */ +define('CURLOPT_PROTOCOLS_STR', 10318); + +/** + * @since 8.3 + */ +define('CURLOPT_REDIR_PROTOCOLS_STR', 10319); + +/** + * @since 8.3 + */ +define('CURLOPT_WS_OPTIONS', 320); + +/** + * @since 8.3 + */ +define('CURLWS_RAW_MODE', 1); + +/** + * @since 8.3 + */ +define('CURLOPT_CA_CACHE_TIMEOUT', 321); + +/** + * @since 8.3 + */ +define('CURLOPT_QUICK_EXIT', 322); + /** * Value for the CURLOPT_SSH_AUTH_TYPES option. * libcurl attempts to connect to ssh-agent or pageant and let the agent attempt the authentication. @@ -2973,7 +3050,7 @@ /** * @link https://php.net/manual/en/curl.constants.php */ -define("CURLINFO_LASTONE", 62); +define("CURLINFO_LASTONE", 64); /** * An easy handle already added to a multi handle was attempted to get added a second time. * @link https://www.php.net/manual/en/function.curl-multi-exec.php diff --git a/date/date.php b/date/date.php index 36e1766ec..b72ce4452 100644 --- a/date/date.php +++ b/date/date.php @@ -382,7 +382,8 @@ function date(string $format, ?int $timestamp) {} * * * - * @param int|null $timestamp [optional] + * @param int|null $timestamp [optional] Default value: time(). The optional timestamp parameter is an integer Unix timestamp + * that defaults to the current local time if a timestamp is not given. * @return int|false an integer. ** As idate always returns an integer and @@ -400,7 +401,8 @@ function idate(string $format, ?int $timestamp): int|false {} * The format of the outputted date string. See the formatting * options for the date function. *
- * @param int|null $timestamp [optional] + * @param int|null $timestamp [optional] Default value: time(). The optional timestamp parameter is an integer Unix timestamp + * that defaults to the current local time if a timestamp is not given. * @return string|false a formatted date string. If a non-numeric value is used for * timestamp, false is returned and an * E_WARNING level error is emitted. @@ -1344,7 +1346,7 @@ function timezone_offset_get(DateTimeZone $object, DateTimeInterface $datetime) * @return array|falseReturns numerically indexed array containing associative array with all transitions on success or FALSE on failure.
*/ #[Pure(true)] -function timezone_transitions_get(DateTimeZone $object, int $timestampBegin, int $timestampEnd): array|false {} +function timezone_transitions_get(DateTimeZone $object, int $timestampBegin = PHP_INT_MIN, int $timestampEnd = PHP_INT_MAX): array|false {} /** * Alias: diff --git a/date/date_c.php b/date/date_c.php index d6db7e837..9e2bd89bb 100644 --- a/date/date_c.php +++ b/date/date_c.php @@ -809,8 +809,8 @@ public function getOffset(DateTimeInterface $datetime): int {} public function getTransitions( #[PhpStormStubsElementAvailable(from: '5.3', to: '5.6')] $timestampBegin, #[PhpStormStubsElementAvailable(from: '5.3', to: '5.6')] $timestampEnd, - #[PhpStormStubsElementAvailable(from: '7.0')] #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $timestampBegin = null, - #[PhpStormStubsElementAvailable(from: '7.0')] #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $timestampEnd = null + #[PhpStormStubsElementAvailable(from: '7.0')] #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $timestampBegin = PHP_INT_MIN, + #[PhpStormStubsElementAvailable(from: '7.0')] #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $timestampEnd = PHP_INT_MAX ): array|false {} /** @@ -1100,4 +1100,54 @@ public function __serialize(): array {} #[PhpStormStubsElementAvailable(from: '8.2')] public function __unserialize(array $data): void {} + + /** + * @since 8.3 + */ + public static function createFromISO8601String(string $specification, int $options = 0): static {} } + +/** + * @since 8.3 + */ +class DateError extends Error {} + +/** + * @since 8.3 + */ +class DateObjectError extends DateError {} + +/** + * @since 8.3 + */ +class DateRangeError extends DateError {} + +/** + * @since 8.3 + */ +class DateException extends Exception {} + +/** + * @since 8.3 + */ +class DateInvalidTimeZoneException extends DateException {} + +/** + * @since 8.3 + */ +class DateInvalidOperationException extends DateException {} + +/** + * @since 8.3 + */ +class DateMalformedStringException extends DateException {} + +/** + * @since 8.3 + */ +class DateMalformedIntervalStringException extends DateException {} + +/** + * @since 8.3 + */ +class DateMalformedPeriodStringException extends DateException {} diff --git a/dba/dba.php b/dba/dba.php index fbf439622..773a54df4 100644 --- a/dba/dba.php +++ b/dba/dba.php @@ -1,6 +1,7 @@ FALSE * otherwise. */ +#[Deprecated(since: 8.3)] function dba_fetch($key, $skip, $dba): string|false {} /** diff --git a/dom/dom_c.php b/dom/dom_c.php index 9622a4ef6..69cd4c433 100644 --- a/dom/dom_c.php +++ b/dom/dom_c.php @@ -142,6 +142,8 @@ class DOMNode */ #[LanguageLevelTypeAware(['8.1' => 'string'], default: '')] public $textContent; + public bool $isConnected; + public ?DOMElement $parentElement; /** * Adds a new child before a reference node @@ -254,6 +256,7 @@ public function hasAttributes(): bool {} /** * @param DOMNode $other + * @removed 8.0 */ public function compareDocumentPosition(DOMNode $other) {} @@ -297,7 +300,7 @@ public function isDefaultNamespace(#[LanguageLevelTypeAware(['8.0' => 'string'], * @param string|null $prefix* The prefix of the namespace. *
- * @return string The namespace URI of the node. + * @return string|null The namespace URI of the node. */ #[PhpStormStubsElementAvailable(from: '8.0')] #[TentativeType] @@ -306,38 +309,25 @@ public function lookupNamespaceURI(?string $prefix): ?string {} /** * Gets the namespace URI of the node based on the prefix * @link https://php.net/manual/en/domnode.lookupnamespaceuri.php - * @param string $prefix+ * @param string|null $prefix
* The prefix of the namespace. *
- * @return string The namespace URI of the node. + * @return string|null The namespace URI of the node. */ #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] public function lookupNamespaceUri($prefix) {} /** - * @param DOMNode $arg + * @param DOMNode|null $arg * @return bool */ - public function isEqualNode(DOMNode $arg) {} + #[LanguageLevelTypeAware(['8.3' => 'bool'], default: '')] + public function isEqualNode(#[LanguageLevelTypeAware(['8.3' => 'DOMNode|null'], default: 'DOMNode')] $otherNode) {} - /** - * @param $feature - * @param $version - * @return mixed - */ public function getFeature($feature, $version) {} - /** - * @param $key - * @param $data - * @param $handler - */ public function setUserData($key, $data, $handler) {} - /** - * @param $key - * @return mixed - */ public function getUserData($key) {} /** @@ -390,6 +380,26 @@ public function C14NFile( #[LanguageLevelTypeAware(['8.0' => 'array|null'], default: 'array')] $xpath = null, #[LanguageLevelTypeAware(['8.0' => 'array|null'], default: 'array')] $nsPrefixes = null ): int|false {} + + /** + * @since 8.3 + */ + public function contains(DOMNode|DOMNameSpaceNode|null $other): bool {} + + /** + * @since 8.3 + */ + public function getRootNode(?array $options = null): DOMNode {} + + /** + * @since 8.1 + */ + public function __sleep(): array {} + + /** + * @since 8.1 + */ + public function __wakeup(): void {} } /** @@ -576,6 +586,18 @@ class DOMNameSpaceNode #[LanguageLevelTypeAware(['8.1' => 'string'], default: '')] public $nodeName; + public ?DOMElement $parentElement; + public bool $isConnected; + + /** + * @since 8.1 + */ + public function __sleep(): array {} + + /** + * @since 8.1 + */ + public function __wakeup(): void {} } /** @@ -615,6 +637,12 @@ public function append(...$nodes): void {} * {@inheritDoc} */ public function prepend(...$nodes): void {} + + /** + * @since 8.3 + * {@inheritDoc} + */ + public function replaceChildren(...$nodes): void {} } /** @@ -868,7 +896,7 @@ public function createCDATASection(#[LanguageLevelTypeAware(['8.0' => 'string'], public function createProcessingInstruction( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $target, #[PhpStormStubsElementAvailable(from: '5.3', to: '7.3')] $data, - #[PhpStormStubsElementAvailable(from: '7.4')] #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $data = null + #[PhpStormStubsElementAvailable(from: '7.4')] #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $data = '' ) {} /** @@ -1000,9 +1028,8 @@ public function getElementsByTagNameNS( #[TentativeType] public function getElementById(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $elementId): ?DOMElement {} - /** - * @param DOMNode $node - */ + #[TentativeType] + #[LanguageLevelTypeAware(['8.3' => 'DOMNode|false'], default: '')] public function adoptNode(DOMNode $node) {} /** @@ -1015,6 +1042,12 @@ public function append(...$nodes): void {} */ public function prepend(...$nodes): void {} + /** + * @since 8.3 + * {@inheritDoc} + */ + public function replaceChildren(...$nodes): void {} + /** * Normalizes the document * @link https://php.net/manual/en/domdocument.normalizedocument.php @@ -1040,13 +1073,15 @@ public function renameNode(DOMNode $node, $namespace, $qualifiedName) {} * Bitwise OR * of the libxml option constants. * - * @return DOMDocument|bool true on success or false on failure. If called statically, returns a + * @return DOMDocument|bool true on success or false on failure. Prior to PHP 8.3 if called statically, returns a * DOMDocument and issues E_STRICT * warning. */ + #[TentativeType] + #[LanguageLevelTypeAware(['8.3' => 'bool'], default: 'DOMDocument|bool')] public function load( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $filename, - #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $options = null + #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $options = 0 ) {} /** @@ -1072,13 +1107,15 @@ public function save($filename, $options = null) {} * Bitwise OR * of the libxml option constants. * - * @return DOMDocument|bool true on success or false on failure. If called statically, returns a + * @return DOMDocument|bool true on success or false on failure. Prior to PHP 8.3 if called statically, returns a * DOMDocument and issues E_STRICT * warning. */ + #[TentativeType] + #[LanguageLevelTypeAware(['8.3' => 'bool'], default: 'DOMDocument|bool')] public function loadXML( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $source, - #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $options = null + #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $options = 0 ) {} /** @@ -1096,7 +1133,7 @@ public function loadXML( #[TentativeType] public function saveXML( ?DOMNode $node = null, - #[PhpStormStubsElementAvailable(from: '7.0')] #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $options = null + #[PhpStormStubsElementAvailable(from: '7.0')] #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $options = 0 ): string|false {} /** @@ -1129,7 +1166,7 @@ public function validate(): bool {} * @return int|false the number of XIncludes in the document. */ #[TentativeType] - public function xinclude(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $options = null): int|false {} + public function xinclude(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $options = 0): int|false {} /** * Load HTML from a string @@ -1141,10 +1178,12 @@ public function xinclude(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '') * Since PHP 5.4.0 and Libxml 2.6.0, you may also * use the options parameter to specify additional Libxml parameters. * - * @return DOMDocument|bool true on success or false on failure. If called statically, returns a + * @return DOMDocument|bool true on success or false on failure. Prior to PHP 8.3 if called statically, returns a * DOMDocument and issues E_STRICT * warning. */ + #[TentativeType] + #[LanguageLevelTypeAware(['8.3' => 'bool'], default: 'DOMDocument|bool')] public function loadHTML( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $source, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $options = 0 @@ -1160,10 +1199,12 @@ public function loadHTML( * Since PHP 5.4.0 and Libxml 2.6.0, you may also * use the options parameter to specify additional Libxml parameters. * - * @return DOMDocument|bool true on success or false on failure. If called statically, returns a + * @return DOMDocument|bool true on success or false on failure. Prior to PHP 8.3 if called statically, returns a * DOMDocument and issues E_STRICT * warning. */ + #[TentativeType] + #[LanguageLevelTypeAware(['8.3' => 'bool'], default: 'DOMDocument|bool')] public function loadHTMLFile( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $filename, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $options = 0 @@ -1442,10 +1483,10 @@ public function substringData( * @param string $data* The string to append. *
- * @return void */ #[TentativeType] - public function appendData(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $data): bool {} + #[LanguageLevelTypeAware(['8.3' => 'true'], default: 'bool')] + public function appendData(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $data) {} /** * Insert a string at the specified 16-bit unit offset @@ -1678,6 +1719,8 @@ class DOMElement extends DOMNode implements DOMParentNode, DOMChildNode #[LanguageLevelTypeAware(['8.1' => 'DOMElement|null'], default: '')] public $nextElementSibling; + public string $id; + public string $className; /** * Returns value of attribute @@ -1975,6 +2018,12 @@ public function append(...$nodes): void {} */ public function prepend(...$nodes): void {} + /** + * @since 8.3 + * {@inheritDoc} + */ + public function replaceChildren(...$nodes): void {} + /** * Creates a new DOMElement object * @link https://php.net/manual/en/domelement.construct.php @@ -1986,8 +2035,28 @@ public function prepend(...$nodes): void {} public function __construct( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $qualifiedName, #[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $value = null, - #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $namespace = null + #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $namespace = '' ) {} + + /** + * @since 8.3 + */ + public function getAttributeNames(): array {} + + /** + * @since 8.3 + */ + public function toggleAttribute(string $qualifiedName, ?bool $force = null): bool {} + + /** + * @since 8.3 + */ + public function insertAdjacentElement(string $where, DOMElement $element): ?DOMElement {} + + /** + * @since 8.3 + */ + public function insertAdjacentText(string $where, string $data): void {} } /** @@ -2036,7 +2105,7 @@ public function replaceWholeText($content) {} * @link https://php.net/manual/en/domtext.construct.php * @param string $data [optional] The value of the text node. If not supplied an empty text node is created. */ - public function __construct(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $data) {} + public function __construct(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $data = '') {} } /** @@ -2051,7 +2120,7 @@ class DOMComment extends DOMCharacterData * @link https://php.net/manual/en/domcomment.construct.php * @param string $data [optional] The value of the comment */ - public function __construct(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $data) {} + public function __construct(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $data = '') {} } /** @@ -2302,7 +2371,7 @@ class DOMProcessingInstruction extends DOMNode */ public function __construct( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $name, - #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $value + #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $value = '' ) {} } @@ -2454,6 +2523,11 @@ public function append(...$nodes): void; * @since 8.0 */ public function prepend(...$nodes): void; + + /** + * @since 8.3 + */ + public function replaceChildren(...$nodes): void; } /** diff --git a/fileinfo/fileinfo.php b/fileinfo/fileinfo.php index a13a2d197..c29106777 100644 --- a/fileinfo/fileinfo.php +++ b/fileinfo/fileinfo.php @@ -14,7 +14,7 @@ class finfo * @param string $magic_database [optional] */ public function __construct( - #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $flags, + #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $flags = 0, #[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $magic_database ) {} diff --git a/gd/gd.php b/gd/gd.php index 08537aeb2..43068286e 100644 --- a/gd/gd.php +++ b/gd/gd.php @@ -818,11 +818,16 @@ function imagecopyresampled(GdImage $dst_image, GdImage $src_image, int $dst_x, * Specifies the color of the uncovered zone after the rotation * * @param bool $ignore_transparent [optional]- * If set and non-zero, transparent colors are ignored (otherwise kept). + * Prior to PHP 8.3 if set and non-zero, transparent colors are ignored (otherwise kept). *
* @return resource|GdImage|false the rotated image or FALSE on failure */ -function imagerotate(GdImage $image, float $angle, int $background_color, bool $ignore_transparent = false): GdImage|false {} +function imagerotate( + GdImage $image, + float $angle, + int $background_color, + #[PhpStormStubsElementAvailable(to: '8.2')] bool $ignore_transparent = false +): GdImage|false {} /** * Should antialias functions be used or not.- * The path to save the file to. If not set or null, the raw image stream - * will be outputted directly. + * @param resource|string|null $file [optional]
+ * The path or an open stream resource (which is automatically closed after this function returns) + * to save the file to. If not set or null, the raw image stream will be output directly. *
* @param int $quality [optional]* quality ranges from 0 (worst quality, smaller file) to 100 (best quality, biggest file). @@ -1033,7 +1038,7 @@ function imagepng(GdImage $image, $file = null, int $quality = -1, int $filters * @return bool true on success or false on failure. * @since 5.4 */ -function imagewebp($image, $to = null, $quality = 80): bool {} +function imagewebp(GdImage $image, $file = null, int $quality = -1): bool {} /** * Output image to browser or file @@ -1066,7 +1071,7 @@ function imagegif(GdImage $image, $file = null): bool {} *
* @return bool true on success or false on failure. */ -function imagejpeg($image, $file = null, $quality = null): bool {} +function imagejpeg(GdImage $image, $file = null, int $quality = -1): bool {} /** * Output image to browser or file @@ -1116,7 +1121,7 @@ function imagegd(GdImage $image, ?string $file = null): bool {} * * @return bool true on success or false on failure. */ -function imagegd2(GdImage $image, ?string $file = null, int $chunk_size = null, int $mode = null): bool {} +function imagegd2(GdImage $image, ?string $file = null, int $chunk_size = 128, int $mode = IMG_GD2_RAW): bool {} /** * Destroy an image @@ -1445,7 +1450,9 @@ function imagesetpixel(GdImage $image, int $x, int $y, int $color): bool {} * Draw a string horizontally * @link https://php.net/manual/en/function.imagestring.php * @param resource|GdImage $image - * @param int $font + * @param int $font+ * Can be 1, 2, 3, 4, 5 for built-in fonts in latin2 encoding (where higher numbers corresponding to larger fonts) or (since 8.1) GdFont instance + *
* @param int $x* x-coordinate of the upper left corner. *
@@ -1562,9 +1569,10 @@ function imagedashedline(GdImage $image, int $x1, int $y1, int $x2, int $y2, int * search for files that do not begin with a leading '/' by appending * '.ttf' to the filename and searching along a library-defined font path. * - * @param string $text+ * @param string $string
* The string to be measured. *
+ * @param array $options [optional] * @return array|false imagettfbbox returns an array with 8 * elements representing four points making the bounding box of the * text on success and false on error. @@ -1611,7 +1619,7 @@ function imagedashedline(GdImage $image, int $x1, int $y1, int $x2, int $y2, int * corner seeing the text horizontally. */ #[Pure] -function imagettfbbox($size, $angle, $font_filename, $text) {} +function imagettfbbox(float $size, float $angle, string $font_filename, string $string, #[PhpStormStubsElementAvailable(from: '8.0')] array $options = []): array|false {} /** * Write text to the image using TrueType fonts @@ -1696,6 +1704,7 @@ function imagettfbbox($size, $angle, $font_filename, $text) {} * If a character is used in the string which is not supported by the * font, a hollow rectangle will replace the character. * + * @param array $options [optional] * @return array|false an array with 8 elements representing four points making the * bounding box of the text. The order of the points is lower left, lower * right, upper right, upper left. The points are relative to the text @@ -1703,7 +1712,7 @@ function imagettfbbox($size, $angle, $font_filename, $text) {} * corner when you see the text horizontally. * Returns false on error. */ -function imagettftext(GdImage $image, float $size, float $angle, int $x, int $y, int $color, string $font_filename, string $text, array $options = []): array|false {} +function imagettftext(GdImage $image, float $size, float $angle, int $x, int $y, int $color, string $font_filename, string $text, #[PhpStormStubsElementAvailable(from: '8.0')] array $options = []): array|false {} /** * Give the bounding box of a text using fonts via freetype2 @@ -1722,10 +1731,10 @@ function imagettftext(GdImage $image, float $size, float $angle, int $x, int $y, * search for files that do not begin with a leading '/' by appending * '.ttf' to the filename and searching along a library-defined font path. * - * @param string $text+ * @param string $string
* The string to be measured. *
- * @param array $extrainfo [optional]+ * @param array $options [optional]
*
* An optional seed value *
* @param int $mode [optional]@@ -23,7 +24,7 @@ function lcg_value(): float {} * @return void */ function mt_srand( - int $seed = null, + #[LanguageLevelTypeAware(['8.3' => 'int|null'], default: 'int')] $seed = null, #[PhpStormStubsElementAvailable(from: '7.1')] int $mode = MT_RAND_MT19937 ): void {} @@ -33,7 +34,7 @@ function mt_srand( * an alias of {@see mt_srand()}. *
* @link https://php.net/manual/en/function.srand.php - * @param int $seed+ * @param int|null $seed
* Optional seed value *
* @param int $mode [optional]@@ -42,24 +43,24 @@ function mt_srand( * @return void */ function srand( - int $seed = null, + #[LanguageLevelTypeAware(['8.3' => 'int|null'], default: 'int')] $seed = null, #[PhpStormStubsElementAvailable(from: '7.1')] int $mode = MT_RAND_MT19937 ): void {} /** * Generate a random integer * @link https://php.net/manual/en/function.rand.php - * @param int $min + * @param int $min [optional] * @param int $max [optional] * @return int A pseudo random value between min * (or 0) and max (or getrandmax, inclusive). */ - function rand(int $min = null, int $max): int {} + function rand(int $min, int $max): int {} /** * Generate a random value via the Mersenne Twister Random Number Generator * @link https://php.net/manual/en/function.mt-rand.php - * @param int $min
+ * @param int $min [optional]
* Optional lowest value to be returned (default: 0) *
* @param int $max [optional]@@ -68,7 +69,7 @@ function rand(int $min = null, int $max): int {} * @return int A random integer value between min (or 0) * and max (or mt_getrandmax, inclusive) */ - function mt_rand(int $min = null, int $max): int {} + function mt_rand(int $min, int $max): int {} /** * Show largest possible random value @@ -92,7 +93,7 @@ function getrandmax(): int {} * @param int $length The length of the random string that should be returned in bytes. * @return string Returns a string containing the requested number of cryptographically secure random bytes. * @since 7.0 - * @throws Exception if an appropriate source of randomness cannot be found. + * @throws Random\RandomException if an appropriate source of randomness cannot be found. */ function random_bytes(int $length): string {} @@ -103,7 +104,7 @@ function random_bytes(int $length): string {} * @param int $max The highest value to be returned, which must be less than or equal to PHP_INT_MAX. * @return int Returns a cryptographically secure random integer in the range min to max, inclusive. * @since 7.0 - * @throws Exception if an appropriate source of randomness cannot be found. + * @throws Random\RandomException if an appropriate source of randomness cannot be found. */ function random_int(int $min, int $max): int {} } @@ -214,6 +215,21 @@ public function pickArrayKeys(array $array, int $num): array {} public function __serialize(): array {} public function __unserialize(array $data): void {} + + /** + * @since 8.3 + */ + public function nextFloat(): float {} + + /** + * @since 8.3 + */ + public function getFloat(float $min, float $max, IntervalBoundary $boundary = IntervalBoundary::ClosedOpen): float {} + + /** + * @since 8.3 + */ + public function getBytesFromString(string $string, int $length): string {} } /** @@ -230,4 +246,19 @@ class BrokenRandomEngineError extends RandomError {} * @since 8.2 */ class RandomException extends Exception {} + + /** + * @since 8.3 + */ + enum IntervalBoundary + { + public string $name; + + case ClosedOpen; + case ClosedClosed; + case OpenClosed; + case OpenOpen; + + public static function cases(): array {} + } } diff --git a/redis/Redis.php b/redis/Redis.php index f6146b689..f01caf329 100644 --- a/redis/Redis.php +++ b/redis/Redis.php @@ -154,10 +154,10 @@ public function __construct($options = null) {} * * @param string $host can be a host, or the path to a unix domain socket * @param int $port optional - * @param float $timeout value in seconds (optional, default is 0.0 meaning unlimited) + * @param float $timeout value in seconds (optional, default is 0.0 meaning it will use `default_socket_timeout`) * @param string|null $persistent_id identity for the requested persistent connection * @param int $retry_interval retry interval in milliseconds. - * @param float $read_timeout value in seconds (optional, default is 0 meaning unlimited) + * @param float $read_timeout value in seconds (optional, default is 0 meaning it will use `default_socket_timeout`) * @param array|null $context since PhpRedis >= 5.3.0 can specify authentication and stream information on connect * * @return bool TRUE on success, FALSE on error @@ -189,10 +189,10 @@ public function connect( * * @param string $host can be a host, or the path to a unix domain socket * @param int $port optional - * @param float $timeout value in seconds (optional, default is 0.0 meaning unlimited) + * @param float $timeout value in seconds (optional, default is 0.0 meaning it will use `default_socket_timeout`) * @param string $persistent_id identity for the requested persistent connection * @param int $retry_interval retry interval in milliseconds. - * @param float $read_timeout value in seconds (optional, default is 0 meaning unlimited) + * @param float $read_timeout value in seconds (optional, default is 0 meaning it will use `default_socket_timeout`) * @param array $context since PhpRedis >= 5.3.0 can specify authentication and stream information on connect * * @return bool TRUE on success, FALSE on error @@ -304,10 +304,10 @@ public function getAuth() {} * * @param string $host can be a host, or the path to a unix domain socket * @param int $port optional - * @param float $timeout value in seconds (optional, default is 0.0 meaning unlimited) + * @param float $timeout value in seconds (optional, default is 0.0 meaning it will use `default_socket_timeout`) * @param string|null $persistent_id identity for the requested persistent connection * @param int $retry_interval retry interval in milliseconds. - * @param float $read_timeout value in seconds (optional, default is 0 meaning unlimited) + * @param float $read_timeout value in seconds (optional, default is 0 meaning it will use `default_socket_timeout`) * @param array|null $context since PhpRedis >= 5.3.0 can specify authentication and stream information on connect * * @return bool TRUE on success, FALSE on error. diff --git a/redis/RedisCluster.php b/redis/RedisCluster.php index 3fb316e14..9737026ef 100644 --- a/redis/RedisCluster.php +++ b/redis/RedisCluster.php @@ -77,11 +77,12 @@ class RedisCluster * Creates a Redis Cluster client * * @param string|null $name - * @param array $seeds - * @param float $timeout - * @param float $readTimeout + * @param array|null $seeds + * @param int|float $timeout + * @param int|float $readTimeout * @param bool $persistent - * @param string|null $auth + * @param mixed $auth + * @param array|null $context * @throws RedisClusterException * * @example @@ -105,7 +106,7 @@ class RedisCluster * $redisClusterDev = new RedisCluster('test'); * */ - public function __construct($name, $seeds, $timeout = null, $readTimeout = null, $persistent = false, $auth = null) {} + public function __construct($name, $seeds = null, $timeout = null, $readTimeout = null, $persistent = false, $auth = null, $context = null) {} /** * Disconnects from the RedisCluster instance, except when pconnect is used. @@ -246,7 +247,7 @@ public function del($key1, ...$otherKeys) {} * * @param string $key * @param int $ttl - * @param string $value + * @param mixed $value * * @return bool TRUE if the command is successful. * @link https://redis.io/commands/setex @@ -877,9 +878,9 @@ public function sIsMember($key, $value) {} * If this value is already in the set, FALSE is returned. * * @param string $key Required key - * @param string $value1 Required value - * @param string $value2 Optional value - * @param string $valueN Optional value + * @param mixed $value1 Required value + * @param mixed $value2 Optional value + * @param mixed $valueN Optional value * * @return int|false The number of elements added to the set * @link https://redis.io/commands/sadd @@ -1538,7 +1539,7 @@ public function hIncrBy($key, $hashKey, $value) {} * * @param string $key * @param string $hashKey - * @param string $value + * @param mixed $value * * @return int * 1 if value didn't exist and was added successfully, diff --git a/relay/Relay.php b/relay/Relay.php index 2cca4c6a5..8962353bb 100644 --- a/relay/Relay.php +++ b/relay/Relay.php @@ -12,14 +12,14 @@ class Relay * * @var string */ - public const VERSION = "0.6.2"; + public const VERSION = "0.6.8"; /** * Relay's version. * * @var string */ - public const Version = "0.6.2"; + public const Version = "0.6.8"; /** * Integer representing no compression algorithm. @@ -108,6 +108,16 @@ class Relay */ public const MULTI = 0x01; + /** + * Integer representing we're SUBSCRIBED. Note that this constant can + * only really be accessed when `true` is passed to `getMask()` telling + * relay to return the complete bitmasked mode. + * + * @see \Relay\Relay::getMode() + * @var int + **/ + public const SUBSCRIBED = 0x04; + /** * Integer representing the prefix option. * @@ -397,7 +407,7 @@ class Relay /** * Establishes a new connection to Redis, or re-uses already opened connection. * - * @param string $host + * @param string|array|null $host * @param int $port * @param float $connect_timeout * @param float $command_timeout @@ -405,11 +415,12 @@ class Relay */ #[\Relay\Attributes\Server] public function __construct( - string $host = null, + string|array|null $host = null, int $port = 6379, float $connect_timeout = 0.0, float $command_timeout = 0.0, - #[\SensitiveParameter] array $context = [], + #[\SensitiveParameter] + array $context = [], int $database = 0, ) {} @@ -435,7 +446,8 @@ public function connect( ?string $persistent_id = null, int $retry_interval = 0, float $read_timeout = 0.0, - #[\SensitiveParameter] array $context = [], + #[\SensitiveParameter] + array $context = [], int $database = 0 ): bool {} @@ -460,7 +472,8 @@ public function pconnect( ?string $persistent_id = null, int $retry_interval = 0, float $read_timeout = 0.0, - #[\SensitiveParameter] array $context = [], + #[\SensitiveParameter] + array $context = [], int $database = 0 ): bool {} @@ -801,9 +814,12 @@ public static function license(): array {} * - `stats.empty`: How many times we've run out of free requests (indicating the size of the ring buffers should be increased) * - `stats.oom`: The number of times we've run out of memory * - `stats.ops_per_sec`: The number of commands processed per second - * - `stats.walltime`: The number of microseconds Relay has spent doing work * - `stats.bytes_sent`: The number of bytes Relay has written to the network * - `stats.bytes_received`: The number of bytes Relay has read from the network + * - `stats.command_usec`: Deprecated + * - `stats.rinit_usec`: The number of microseconds Relay has spent in request initialization + * - `stats.rshutdown_usec`: The number of microseconds Relay has spent in request shutdown + * - `stats.sigio_usec`: The number of microseconds Relay has spent in its SIGIO handler * * - `memory.total`: The total bytes of allocated memory * - `memory.limit`: The capped number of bytes Relay has available to use @@ -1003,7 +1019,8 @@ public function migrate( int $timeout, bool $copy = false, bool $replace = false, - #[\SensitiveParameter] mixed $credentials = null + #[\SensitiveParameter] + mixed $credentials = null ): Relay|bool {} /** @@ -1390,6 +1407,17 @@ public function getbit(mixed $key, int $pos): Relay|int|false {} #[\Relay\Attributes\RedisCommand, \Relay\Attributes\Cached] public function bitcount(mixed $key, int $start = 0, int $end = -1, bool $by_bit = false): Relay|int|false {} + /** + * Perform various bitfield operations on a string key, such as getting/setting bit ranges, + * incrementing, etc. + * + * @param mixed $key + * @param mixed $args,... + * @return Relay|array|false + */ + #[\Relay\Attributes\RedisCommand] + public function bitfield(mixed $key, mixed ...$args): Relay|array|false {} + /** * This is a container command for runtime configuration commands. * @@ -1564,6 +1592,26 @@ public function psetex(mixed $key, int $milliseconds, mixed $value): Relay|bool #[\Relay\Attributes\RedisCommand] public function publish(string $channel, string $message): Relay|int|false {} + /** + * A container command for Pub/Sub introspection commands. + * + * @param string $operation + * @param mixed $args,... + * @return mixed + */ + #[\Relay\Attributes\RedisCommand] + public function pubsub(string $operation, mixed ...$args): mixed {} + + /** + * Posts a message to the given shard channel. + * + * @param string $channel + * @param string $message + * @return Relay|int|false + */ + #[\Relay\Attributes\RedisCommand] + public function spublish(string $channel, string $message): Relay|int|false {} + /** * Set key to hold string value if key does not exist. In that case, it is equal to SET. * When key already holds a value, no operation is performed. @@ -2314,6 +2362,63 @@ public function sunion(mixed $key, mixed ...$other_keys): Relay|array|false {} #[\Relay\Attributes\RedisCommand] public function sunionstore(mixed $key, mixed ...$other_keys): Relay|int|false {} + /** + * Subscribes to the specified channels. + * + * @param array $channels + * @param callable $callback + * @return bool + */ + #[\Relay\Attributes\RedisCommand] + public function subscribe(array $channels, callable $callback): bool {} + + /** + * Unsubscribes from the given channels, or from all of them if none is given. + * + * @param array $channels + * @return bool + */ + #[\Relay\Attributes\RedisCommand] + public function unsubscribe(array $channels = []): bool {} + + /** + * Subscribes to the given patterns. + * + * @param array $patterns + * @param callable $callback + * @return bool + */ + #[\Relay\Attributes\RedisCommand] + public function psubscribe(array $patterns, callable $callback): bool {} + + /** + * Unsubscribes from the given patterns, or from all of them if none is given. + * + * @param array $patterns + * @return bool + */ + #[\Relay\Attributes\RedisCommand] + public function punsubscribe(array $patterns = []): bool {} + + /** + * Subscribes to the specified shard channels. + * + * @param array $channels + * @param callable $callback + * @return bool + */ + #[\Relay\Attributes\RedisCommand] + public function ssubscribe(array $channels, callable $callback): bool {} + + /** + * Unsubscribes from the given shard channels, or from all of them if none is given. + * + * @param array $channels + * @return bool + */ + #[\Relay\Attributes\RedisCommand] + public function sunsubscribe(array $channels = []): bool {} + /** * Alters the last access time of a key(s). * diff --git a/relay/Sentinel.php b/relay/Sentinel.php index e2a14c4df..fdd99a00d 100644 --- a/relay/Sentinel.php +++ b/relay/Sentinel.php @@ -27,7 +27,10 @@ class Sentinel /** * Establishes a new connection to a Sentinel instance. * - * @param string $host + * For backwards compatibility with PhpRedis 6.x, the + * constructor may be called with a single options array. + * + * @param array|string|null $host * @param int $port * @param float $timeout * @param mixed $persistent @@ -37,13 +40,14 @@ class Sentinel */ #[\Relay\Attributes\Server] public function __construct( - string $host, + array|string|null $host = null, int $port = 26379, float $timeout = 0, mixed $persistent = null, int $retry_interval = 0, float $read_timeout = 0, - #[\SensitiveParameter] mixed $auth = null + #[\SensitiveParameter] + mixed $auth = null ) {} /** diff --git a/relay/Table.php b/relay/Table.php new file mode 100644 index 000000000..0ec5ee437 --- /dev/null +++ b/relay/Table.php @@ -0,0 +1,73 @@ + 'string|null'], default: '')] $wsdl, - array $options = null + array $options = [] ) {} /** @@ -462,7 +462,7 @@ public function __setCookie( * @since 5.0.1 */ #[TentativeType] - public function __setLocation(#[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $location = ''): ?string {} + public function __setLocation(#[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $location = null): ?string {} /** * Sets SOAP headers for subsequent calls @@ -551,9 +551,9 @@ public function __construct( #[LanguageLevelTypeAware(["8.0" => 'mixed'], default: '')] $data, #[LanguageLevelTypeAware(["7.1" => "int|null"], default: "int")] $encoding, #[LanguageLevelTypeAware(["8.0" => "string|null"], default: "string")] $typeName, - #[LanguageLevelTypeAware(["8.0" => 'string|null'], default: '')] $typeNamespace = '', - #[LanguageLevelTypeAware(["8.0" => 'string|null'], default: '')] $nodeName = '', - #[LanguageLevelTypeAware(["8.0" => 'string|null'], default: '')] $nodeNamespace = '' + #[LanguageLevelTypeAware(["8.0" => 'string|null'], default: '')] $typeNamespace = null, + #[LanguageLevelTypeAware(["8.0" => 'string|null'], default: '')] $nodeName = null, + #[LanguageLevelTypeAware(["8.0" => 'string|null'], default: '')] $nodeNamespace = null ) {} /** @@ -631,7 +631,7 @@ class SoapServer */ public function __construct( #[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $wsdl, - array $options = null + array $options = [] ) {} /** @@ -799,9 +799,9 @@ public function handle(#[LanguageLevelTypeAware(['8.0' => 'string|null'], defaul public function fault( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $code, #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $string, - #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $actor = null, + #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $actor = '', #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $details = null, - #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $name = null + #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $name = '' ): void {} /** @@ -1054,7 +1054,7 @@ class SoapHeader public function __construct( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $namespace, #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $name, - #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $data = null, + #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $data, #[LanguageLevelTypeAware(['8.0' => 'bool'], default: '')] $mustUnderstand = false, #[LanguageLevelTypeAware(['8.0' => 'string|int|null'], default: '')] $actor = null ) {} diff --git a/sockets/sockets.php b/sockets/sockets.php index 7fa20c9f4..b119c19ad 100644 --- a/sockets/sockets.php +++ b/sockets/sockets.php @@ -1400,6 +1400,11 @@ function socket_wsaprotocol_info_import($info_id) {} */ function socket_wsaprotocol_info_release($info_id) {} +/** + * @since 8.3 + */ +function socket_atmark(Socket $socket): bool {} + define('AF_UNIX', 1); define('AF_INET', 2); @@ -1462,7 +1467,12 @@ function socket_wsaprotocol_info_release($info_id) {} define('SO_TYPE', 3); define('SO_ERROR', 4); define('SO_BINDTODEVICE', 25); +define('SO_ATTACH_REUSEPORT_CBPF', 51); +define('SO_DETACH_FILTER', 27); +define('SO_DETACH_BPF', 27); + define('SOL_SOCKET', 1); +define('SOL_UDPLITE', 136); define('SOMAXCONN', 128); /** * @since 8.1 @@ -1560,6 +1570,14 @@ function socket_wsaprotocol_info_release($info_id) {} */ define('IPV6_MULTICAST_LOOP', 19); define('IPV6_V6ONLY', 26); +define('IP_BIND_ADDRESS_NO_PORT', 24); +define('IP_MTU_DISCOVER', 10); +define('IP_PMTUDISC_DO', 2); +define('IP_PMTUDISC_DONT', 0); +define('IP_PMTUDISC_WANT', 1); +define('IP_PMTUDISC_PROBE', 3); +define('IP_PMTUDISC_INTERFACE', 4); +define('IP_PMTUDISC_OMIT', 5); /** * Operation not permitted. @@ -2326,6 +2344,16 @@ function socket_wsaprotocol_info_release($info_id) {} */ define('TCP_KEEPCNT', 6); +/** + * @since 8.3 + */ +define('TCP_QUICKACK', 12); + +/** + * @since 8.3 + */ +define('TCP_REPAIR', 19); + /** * Socket_set_option for the socket_send* functions. * It avoids copy b/w userland and kernel for both TCP and UDP protocols. diff --git a/sqlite3/sqlite3.php b/sqlite3/sqlite3.php index b26210e46..ebcacd143 100644 --- a/sqlite3/sqlite3.php +++ b/sqlite3/sqlite3.php @@ -6,6 +6,11 @@ use JetBrains\PhpStorm\Internal\PhpStormStubsElementAvailable; use JetBrains\PhpStorm\Internal\TentativeType; +/** + * @since 8.3 + */ +class SQLite3Exception extends \Exception {} + /** * A class that interfaces SQLite 3 databases. * @link https://php.net/manual/en/class.sqlite3.php @@ -76,7 +81,7 @@ public function open( #[PhpStormStubsElementAvailable(from: '5.3', to: '5.6')] $flags, #[PhpStormStubsElementAvailable(from: '5.3', to: '5.6')] $encryptionKey, #[PhpStormStubsElementAvailable(from: '7.0')] #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $flags = SQLITE3_OPEN_READWRITE|SQLITE3_OPEN_CREATE, - #[PhpStormStubsElementAvailable(from: '7.0')] #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $encryptionKey = null + #[PhpStormStubsElementAvailable(from: '7.0')] #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $encryptionKey = '' ): void {} /** @@ -365,7 +370,7 @@ public function __construct( #[PhpStormStubsElementAvailable(from: '5.3', to: '5.6')] $flags, #[PhpStormStubsElementAvailable(from: '5.3', to: '5.6')] $encryptionKey, #[PhpStormStubsElementAvailable(from: '7.0')] #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $flags = SQLITE3_OPEN_READWRITE|SQLITE3_OPEN_CREATE, - #[PhpStormStubsElementAvailable(from: '7.0')] #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $encryptionKey = null + #[PhpStormStubsElementAvailable(from: '7.0')] #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $encryptionKey = '' ) {} /** diff --git a/standard/basic.php b/standard/basic.php index 4bf527e93..50fb3ea9c 100644 --- a/standard/basic.php +++ b/standard/basic.php @@ -81,7 +81,7 @@ function is_iterable(mixed $value): bool {} * @deprecated 8.2 Consider to use {@link mb_convert_encoding}, {@link UConverter::transcode()} or {@link iconv()} */ #[Pure] -#[Deprecated(replacement: "mb_convert_encoding(%parameter0%, 'UTF-8')", since: "8.2")] +#[Deprecated(replacement: "mb_convert_encoding(%parameter0%, 'UTF-8', 'ISO-8859-1')", since: "8.2")] function utf8_encode(string $string): string {} /** @@ -95,7 +95,7 @@ function utf8_encode(string $string): string {} * @deprecated 8.2 Consider to use {@link mb_convert_encoding}, {@link UConverter::transcode()} or {@link iconv()} */ #[Pure] -#[Deprecated(replacement: "mb_convert_encoding(%parameter0%, 'ISO-8859-1')", since: "8.2")] +#[Deprecated(replacement: "mb_convert_encoding(%parameter0%, 'ISO-8859-1', 'UTF-8')", since: "8.2")] function utf8_decode(string $string): string {} /** diff --git a/standard/standard_0.php b/standard/standard_0.php index 62c05f4cb..de46f9761 100644 --- a/standard/standard_0.php +++ b/standard/standard_0.php @@ -156,8 +156,8 @@ public function read(#[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $d * @param string $name
* The constant name. *
- * @return mixed the value of the constant, or null if the constant is not - * defined. + * @return mixed the value of the constant. + * @throws Error If the constant is not defined */ #[Pure(true)] function constant(string $name): mixed {} diff --git a/standard/standard_1.php b/standard/standard_1.php index 79b579cfe..ecbd15361 100644 --- a/standard/standard_1.php +++ b/standard/standard_1.php @@ -355,7 +355,7 @@ function stristr(string $haystack, string $needle, bool $before_needle = false): * */ #[Pure] -function strrchr(string $haystack, string $needle): string|false {} +function strrchr(string $haystack, string $needle, #[PhpStormStubsElementAvailable(from: "8.3")] bool $before_needle = false): string|false {} /** * Randomly shuffles a string @@ -499,7 +499,7 @@ function strcoll(string $string1, string $string2): int {} function money_format(string $format, float $number): ?string {} /** - * Return part of a string + * Return part of a string or false on failure. For PHP8.0+ only string is returned * @link https://php.net/manual/en/function.substr.php * @param string $string* The input string. @@ -559,7 +559,6 @@ function money_format(string $format, float $number): ?string {} * $rest = substr("abcdef", -3, -1); // returns "de" * ?> * - * @return string|false the extracted part of string or false on failure. */ #[Pure] #[LanguageLevelTypeAware(["8.0" => "string"], default: "string|false")] @@ -768,7 +767,7 @@ function addcslashes(string $string, string $characters): string {} * @return string the modified string. */ #[Pure] -function rtrim(string $string, string $characters = " \t\n\r\0\x0B"): string {} +function rtrim(string $string, string $characters = " \n\r\t\v\0"): string {} /** * Replace all occurrences of the search string with the replacement string @@ -895,7 +894,7 @@ function chunk_split(string $string, int $length = 76, string $separator = "\r\n * @return string The trimmed string. */ #[Pure] -function trim(string $string, string $characters = " \t\n\r\0\x0B"): string {} +function trim(string $string, string $characters = " \n\r\t\v\0"): string {} /** * Strip whitespace (or other characters) from the beginning of a string @@ -927,7 +926,7 @@ function trim(string $string, string $characters = " \t\n\r\0\x0B"): string {} * (0x0B)), a vertical tab. */ #[Pure] -function ltrim(string $string, string $characters = " \t\n\r\0\x0B"): string {} +function ltrim(string $string, string $characters = " \n\r\t\v\0"): string {} /** * Strip HTML and PHP tags from a string @@ -997,7 +996,7 @@ function similar_text(string $string1, string $string2, &$percent): int {} */ #[Pure] #[LanguageLevelTypeAware(["8.0" => "string[]"], default: "string[]|false")] -function explode(string $separator, string $string, int $limit) {} +function explode(string $separator, string $string, int $limit = PHP_INT_MAX) {} /** * Join array elements with a string diff --git a/standard/standard_2.php b/standard/standard_2.php index 82494741f..8b5188b88 100644 --- a/standard/standard_2.php +++ b/standard/standard_2.php @@ -295,7 +295,7 @@ function str_pad(string $string, int $length, string $pad_string = " ", int $pad * @see rtrim() */ #[Pure] -function chop(string $string, string $characters): string {} +function chop(string $string, string $characters = " \n\r\t\v\0"): string {} /** * Alias: diff --git a/standard/standard_4.php b/standard/standard_4.php index 0c5e43fe2..ba361c1f1 100644 --- a/standard/standard_4.php +++ b/standard/standard_4.php @@ -244,12 +244,12 @@ function debug_zval_dump( * to true, print_r will return its output, instead of * printing it (which it does by default). *
- * @return string|true If given a string, integer or float, + * @return string|bool If given a string, integer or float, * the value itself will be printed. If given an array, values * will be presented in a format that shows keys and elements. Similar * notation is used for objects. */ -function print_r(mixed $value, bool $return = false): string|true {} +function print_r(mixed $value, bool $return = false): string|bool {} /** * Returns the amount of memory allocated to PHP diff --git a/standard/standard_6.php b/standard/standard_6.php index 92835dd96..c72bdf2d8 100644 --- a/standard/standard_6.php +++ b/standard/standard_6.php @@ -589,6 +589,11 @@ function stream_get_contents($stream, ?int $length = null, int $offset = -1): st */ function stream_supports_lock($stream): bool {} +/** + * @since 8.3 + */ +function stream_context_set_options($context, array $options): bool {} + /** * Gets line from file pointer and parse for CSV fields * @link https://php.net/manual/en/function.fgetcsv.php diff --git a/standard/standard_8.php b/standard/standard_8.php index 9b316e7ba..a24464d97 100644 --- a/standard/standard_8.php +++ b/standard/standard_8.php @@ -59,18 +59,16 @@ * (strerror) corresponding to the present value of * errno. * - * @return bool true on success or false on failure. */ #[LanguageLevelTypeAware(['8.2' => 'true'], default: 'bool')] -function syslog(int $priority, string $message): bool {} +function syslog(int $priority, string $message) {} /** * Close connection to system logger * @link https://php.net/manual/en/function.closelog.php - * @return bool true on success or false on failure. */ #[LanguageLevelTypeAware(['8.2' => 'true'], default: 'bool')] -function closelog(): bool {} +function closelog() {} /** * Registers a function that will be called when PHP starts sending output. @@ -140,7 +138,7 @@ function define_syslog_variables() {} */ #[Pure] #[LanguageLevelTypeAware(["8.0" => "string"], default: "string|false")] -function metaphone(string $string, int $max_phonemes = 0): false|string {} +function metaphone(string $string, int $max_phonemes = 0) {} /** * Turn on output buffering @@ -395,10 +393,9 @@ function ob_list_handlers(): array {} * parameter sort_flags, for details * see sort. * - * @return bool true on success or false on failure. */ #[LanguageLevelTypeAware(['8.2' => 'true'], default: 'bool')] -function ksort(array &$array, int $flags = SORT_REGULAR): bool {} +function ksort(array &$array, int $flags = SORT_REGULAR) {} /** * Sort an array by key in reverse order @@ -411,10 +408,9 @@ function ksort(array &$array, int $flags = SORT_REGULAR): bool {} * sort_flags, for details see * sort. * - * @return bool true on success or false on failure. */ #[LanguageLevelTypeAware(['8.2' => 'true'], default: 'bool')] -function krsort(array &$array, int $flags = SORT_REGULAR): bool {} +function krsort(array &$array, int $flags = SORT_REGULAR) {} /** * Sort an array using a "natural order" algorithm @@ -422,9 +418,9 @@ function krsort(array &$array, int $flags = SORT_REGULAR): bool {} * @param array &$array* The input array. *
- * @return bool true on success or false on failure. */ -function natsort(array &$array): bool {} +#[LanguageLevelTypeAware(['8.3' => 'true'], default: 'bool')] +function natsort(array &$array) {} /** * Sort an array using a case insensitive "natural order" algorithm @@ -432,9 +428,9 @@ function natsort(array &$array): bool {} * @param array &$array* The input array. *
- * @return bool true on success or false on failure. */ -function natcasesort(array &$array): bool {} +#[LanguageLevelTypeAware(['8.3' => 'true'], default: 'bool')] +function natcasesort(array &$array) {} /** * Sort an array and maintain index association @@ -447,10 +443,9 @@ function natcasesort(array &$array): bool {} * parameter sort_flags, for details * see sort. * - * @return bool true on success or false on failure. */ #[LanguageLevelTypeAware(['8.2' => 'true'], default: 'bool')] -function asort(array &$array, int $flags = SORT_REGULAR): bool {} +function asort(array &$array, int $flags = SORT_REGULAR) {} /** * Sort an array in reverse order and maintain index association @@ -463,10 +458,9 @@ function asort(array &$array, int $flags = SORT_REGULAR): bool {} * sort_flags, for details see * sort. * - * @return bool true on success or false on failure. */ #[LanguageLevelTypeAware(['8.2' => 'true'], default: 'bool')] -function arsort(array &$array, int $flags = SORT_REGULAR): bool {} +function arsort(array &$array, int $flags = SORT_REGULAR) {} /** * Sort an array @@ -482,10 +476,9 @@ function arsort(array &$array, int $flags = SORT_REGULAR): bool {} * Sorting type flags:* The array. *
- * @return bool true on success or false on failure. */ #[LanguageLevelTypeAware(['8.2' => 'true'], default: 'bool')] -function shuffle(array &$array): bool {} +function shuffle(array &$array) {} /** * Apply a user function to every member of an array @@ -596,10 +585,9 @@ function shuffle(array &$array): bool {} * it will be passed as the third parameter to the callback * funcname. * - * @return bool true on success or false on failure. */ #[LanguageLevelTypeAware(['8.2' => 'true'], default: 'bool')] -function array_walk(object|array &$array, callable $callback, mixed $arg): bool {} +function array_walk(object|array &$array, callable $callback, mixed $arg) {} /** * Apply a user function recursively to every member of an array @@ -625,10 +613,9 @@ function array_walk(object|array &$array, callable $callback, mixed $arg): bool * it will be passed as the third parameter to the callback * funcname. * - * @return bool true on success or false on failure. */ #[LanguageLevelTypeAware(['8.2' => 'true'], default: 'bool')] -function array_walk_recursive(object|array &$array, callable $callback, mixed $arg): bool {} +function array_walk_recursive(object|array &$array, callable $callback, mixed $arg) {} /** * Counts all elements in an array, or something in an object. @@ -937,7 +924,11 @@ function array_fill_keys(array $keys, mixed $value): array {} * end, inclusive. */ #[Pure] -function range($start, $end, int|float $step = 1): array {} +function range( + #[LanguageLevelTypeAware(['8.3' => 'string|int|float'], default: '')] $start, + #[LanguageLevelTypeAware(['8.3' => 'string|int|float'], default: '')] $end, + int|float $step = 1 +): array {} /** * Sort multiple or multi-dimensional arrays diff --git a/standard/standard_9.php b/standard/standard_9.php index 4a2e1acab..03b005473 100644 --- a/standard/standard_9.php +++ b/standard/standard_9.php @@ -4,6 +4,7 @@ * @since 5.6 */ +use JetBrains\PhpStorm\Deprecated; use JetBrains\PhpStorm\ExpectedValues; use JetBrains\PhpStorm\Internal\LanguageLevelTypeAware; use JetBrains\PhpStorm\Internal\PhpStormStubsElementAvailable; @@ -112,7 +113,6 @@ function array_values(array $array): array {} function array_count_values(array $array): array {} /** - * (PHP 5 >=5.5.0)A multi-dimensional array (record set) from which to pull a column of values.
@@ -949,6 +949,7 @@ class AssertionError extends Error {} * * @return mixed The original setting of any option. */ +#[Deprecated(since: "8.3")] function assert_options(int $option, mixed $value): mixed {} /** diff --git a/standard/standard_defines.php b/standard/standard_defines.php index d08e6d4ad..51a3b1117 100644 --- a/standard/standard_defines.php +++ b/standard/standard_defines.php @@ -1267,6 +1267,7 @@ define("MT_RAND_MT19937", 0); /** * @since 7.1 + * @deprecated 8.3 */ define("MT_RAND_PHP", 1); diff --git a/tests/AbstractBaseStubsTestCase.php b/tests/AbstractBaseStubsTestCase.php index a62e5b8f3..24463da2e 100644 --- a/tests/AbstractBaseStubsTestCase.php +++ b/tests/AbstractBaseStubsTestCase.php @@ -16,6 +16,7 @@ use RuntimeException; use StubTests\Model\PHPClass; use StubTests\Model\PHPConst; +use StubTests\Model\PHPEnum; use StubTests\Model\PHPFunction; use StubTests\Model\PHPInterface; use StubTests\Parsers\ParserUtils; @@ -67,6 +68,17 @@ public static function getStringRepresentationOfDefaultParameterValue(mixed $def /** @var PHPConst $rightConstant */ $rightConstant = array_pop($constants); $value = $leftConstant->value|$rightConstant->value; + } elseif ($defaultValue->left instanceof ClassConstFetch && $defaultValue->right instanceof ClassConstFetch){ + $leftClass = $defaultValue->left->class->toString(); + $rightClass = $defaultValue->right->class->toString(); + $leftClass = PhpStormStubsSingleton::getPhpStormStubs()->getClass($leftClass); + $rightClass = PhpStormStubsSingleton::getPhpStormStubs()->getClass($rightClass); + if ($leftClass === null || $rightClass === null) { + throw new Exception("Class $leftClass->name or $rightClass->name not found in stubs"); + } + $leftConstant = $leftClass->getConstant((string)$defaultValue->left->name); + $rightConstant = $rightClass->getConstant((string)$defaultValue->right->name); + $value = $leftConstant->value|$rightConstant->value; } } elseif ($defaultValue instanceof UnaryMinus && property_exists($defaultValue->expr, 'value')) { $value = '-' . $defaultValue->expr->value; @@ -75,12 +87,15 @@ public static function getStringRepresentationOfDefaultParameterValue(mixed $def if ($class === 'self' && $contextClass !== null) { $class = $contextClass->name; } - $parentClass = PhpStormStubsSingleton::getPhpStormStubs()->getClass($class) ?? + $parentClass = PhpStormStubsSingleton::getPhpStormStubs()->getEnum($class) ?? + PhpStormStubsSingleton::getPhpStormStubs()->getClass($class) ?? PhpStormStubsSingleton::getPhpStormStubs()->getInterface($class); if ($parentClass === null) { throw new Exception("Class $class not found in stubs"); } - if ((string)$defaultValue->name === 'class') { + if ($parentClass instanceof PHPEnum) { + $value = $parentClass->name . "::" . $defaultValue->name; + } elseif ((string)$defaultValue->name === 'class') { $value = (string)$defaultValue->class; } else { $constant = $parentClass->getConstant((string)$defaultValue->name);; @@ -90,6 +105,8 @@ public static function getStringRepresentationOfDefaultParameterValue(mixed $def $value = "null"; } elseif (is_array($defaultValue) || $defaultValue instanceof Array_) { $value = '[]'; + } elseif ($defaultValue instanceof \UnitEnum){ + $value = get_class($defaultValue) . "::" . $defaultValue->name; } else { $value = strval($defaultValue); } diff --git a/tests/BaseClassesTest.php b/tests/BaseClassesTest.php index b72046f49..d61290a78 100644 --- a/tests/BaseClassesTest.php +++ b/tests/BaseClassesTest.php @@ -6,6 +6,7 @@ use PHPUnit\Framework\Exception; use RuntimeException; use StubTests\Model\PHPClass; +use StubTests\Model\PHPEnum; use StubTests\Model\PHPInterface; use StubTests\Model\PHPMethod; use StubTests\Model\PHPProperty; @@ -45,10 +46,12 @@ public function testClassesParent(PHPClass|PHPInterface $class) * @dataProvider \StubTests\TestData\Providers\Reflection\ReflectionMethodsProvider::classMethodsProvider * @throws Exception|RuntimeException */ - public function testClassesMethodsExist(PHPClass|PHPInterface $class, PHPMethod $method) + public function testClassesMethodsExist(PHPClass|PHPInterface|PHPEnum $class, PHPMethod $method) { $className = $class->name; - if ($class instanceof PHPClass) { + if ($class instanceof PHPEnum) { + $stubClass = PhpStormStubsSingleton::getPhpStormStubs()->getEnum($className); + } elseif ($class instanceof PHPClass) { $stubClass = PhpStormStubsSingleton::getPhpStormStubs()->getClass($className); } else { $stubClass = PhpStormStubsSingleton::getPhpStormStubs()->getInterface($className); @@ -63,7 +66,9 @@ public function testClassesMethodsExist(PHPClass|PHPInterface $class, PHPMethod public function testClassesFinalMethods(PHPClass|PHPInterface $class, PHPMethod $method) { $className = $class->name; - if ($class instanceof PHPClass) { + if ($class instanceof PHPEnum) { + $stubMethod = PhpStormStubsSingleton::getPhpStormStubs()->getEnum($className)->getMethod($method->name); + } elseif ($class instanceof PHPClass) { $stubMethod = PhpStormStubsSingleton::getPhpStormStubs()->getClass($className)->getMethod($method->name); } else { $stubMethod = PhpStormStubsSingleton::getPhpStormStubs()->getInterface($className)->getMethod($method->name); @@ -82,7 +87,9 @@ public function testClassesFinalMethods(PHPClass|PHPInterface $class, PHPMethod public function testClassesStaticMethods(PHPClass|PHPInterface $class, PHPMethod $method) { $className = $class->name; - if ($class instanceof PHPClass) { + if ($class instanceof PHPEnum) { + $stubMethod = PhpStormStubsSingleton::getPhpStormStubs()->getEnum($className)->getMethod($method->name); + } elseif ($class instanceof PHPClass) { $stubMethod = PhpStormStubsSingleton::getPhpStormStubs()->getClass($className)->getMethod($method->name); } else { $stubMethod = PhpStormStubsSingleton::getPhpStormStubs()->getInterface($className)->getMethod($method->name); @@ -101,7 +108,9 @@ public function testClassesStaticMethods(PHPClass|PHPInterface $class, PHPMethod public function testClassesMethodsVisibility(PHPClass|PHPInterface $class, PHPMethod $method) { $className = $class->name; - if ($class instanceof PHPClass) { + if ($class instanceof PHPEnum) { + $stubMethod = PhpStormStubsSingleton::getPhpStormStubs()->getEnum($className)->getMethod($method->name); + } elseif ($class instanceof PHPClass) { $stubMethod = PhpStormStubsSingleton::getPhpStormStubs()->getClass($className)->getMethod($method->name); } else { $stubMethod = PhpStormStubsSingleton::getPhpStormStubs()->getInterface($className)->getMethod($method->name); @@ -120,7 +129,9 @@ public function testClassesMethodsVisibility(PHPClass|PHPInterface $class, PHPMe public function testClassMethodsParametersCount(PHPClass|PHPInterface $class, PHPMethod $method) { $className = $class->name; - if ($class instanceof PHPClass) { + if ($class instanceof PHPEnum) { + $stubMethod = PhpStormStubsSingleton::getPhpStormStubs()->getEnum($className)->getMethod($method->name); + } elseif ($class instanceof PHPClass) { $stubMethod = PhpStormStubsSingleton::getPhpStormStubs()->getClass($className)->getMethod($method->name); } else { $stubMethod = PhpStormStubsSingleton::getPhpStormStubs()->getInterface($className)->getMethod($method->name); diff --git a/tests/DockerImages/5.6/Dockerfile b/tests/DockerImages/5.6/Dockerfile index 5592f32d0..13508fded 100644 --- a/tests/DockerImages/5.6/Dockerfile +++ b/tests/DockerImages/5.6/Dockerfile @@ -4,7 +4,9 @@ RUN set -eux; \ bash gcc g++ make autoconf pkgconfig git \ libmcrypt-dev imap-dev php7-imap php7-enchant bzip2-dev gettext-dev libxml2-dev php7-dev php7-gd icu-dev \ php7-zip php7-tidy php7-intl libffi-dev openssl-dev php7-pear rabbitmq-c librrd libzip-dev rrdtool-dev \ - gmp-dev yaml yaml-dev fann fann-dev + gmp-dev yaml yaml-dev fann fann-dev libjpeg-turbo-dev libpng-dev libwebp-dev freetype-dev + +RUN docker-php-ext-configure gd --with-freetype-dir=/usr --with-png-dir=/usr --with-webp-dir=/usr --with-jpeg-dir=/usr RUN docker-php-ext-install imap gmp sockets intl bz2 mysqli bcmath calendar dba exif gettext opcache pcntl \ pdo_mysql shmop sysvmsg sysvsem sysvshm xml soap diff --git a/tests/DockerImages/7.0/Dockerfile b/tests/DockerImages/7.0/Dockerfile index a87b4db5b..c64e62f07 100644 --- a/tests/DockerImages/7.0/Dockerfile +++ b/tests/DockerImages/7.0/Dockerfile @@ -5,7 +5,9 @@ RUN set -eux; \ bash gcc g++ make autoconf pkgconfig git \ libmcrypt-dev imap-dev php7-imap php7-enchant bzip2-dev gettext-dev libxml2-dev php7-dev php7-gd icu-dev \ php7-zip php7-tidy php7-intl libffi-dev openssl-dev php7-pear rabbitmq-c librrd libzip-dev rrdtool-dev \ - gmp-dev yaml yaml-dev fann fann-dev aspell-dev + gmp-dev yaml yaml-dev fann fann-dev aspell-dev libjpeg-turbo-dev libpng-dev libwebp-dev freetype-dev + +RUN docker-php-ext-configure gd --with-freetype-dir=/usr --with-png-dir=/usr --with-webp-dir=/usr --with-jpeg-dir=/usr RUN docker-php-ext-install imap gmp sockets intl bz2 mysqli bcmath calendar dba exif gettext opcache pcntl \ pdo_mysql shmop sysvmsg sysvsem sysvshm xml soap pspell diff --git a/tests/DockerImages/7.1/Dockerfile b/tests/DockerImages/7.1/Dockerfile index da6e1de44..c83a52753 100644 --- a/tests/DockerImages/7.1/Dockerfile +++ b/tests/DockerImages/7.1/Dockerfile @@ -6,7 +6,9 @@ RUN set -eux; \ libmcrypt-dev imap-dev php7-imap php7-enchant bzip2-dev gettext-dev libxml2-dev php7-dev php7-gd icu-dev \ php7-zip php7-tidy php7-intl libffi-dev openssl-dev php7-pear rabbitmq-c rabbitmq-c-dev librrd \ libzip-dev rrdtool-dev gmp-dev yaml yaml-dev fann fann-dev openldap-dev librdkafka librdkafka-dev libcurl curl-dev \ - libpng-dev gpgme gpgme-dev aspell-dev + libpng-dev gpgme gpgme-dev aspell-dev libjpeg-turbo-dev libpng-dev libwebp-dev freetype-dev + +RUN docker-php-ext-configure gd --with-freetype-dir=/usr --with-png-dir=/usr --with-webp-dir=/usr --with-jpeg-dir=/usr RUN docker-php-ext-install imap gmp sockets intl gd ldap bz2 mysqli bcmath calendar dba exif gettext opcache pcntl \ pdo_mysql shmop sysvmsg sysvsem sysvshm xml soap pspell diff --git a/tests/DockerImages/7.2/Dockerfile b/tests/DockerImages/7.2/Dockerfile index 1d4611948..59925d362 100644 --- a/tests/DockerImages/7.2/Dockerfile +++ b/tests/DockerImages/7.2/Dockerfile @@ -6,7 +6,9 @@ RUN set -eux; \ libmcrypt-dev imap-dev php7-imap php7-enchant bzip2-dev gettext-dev libxml2-dev php7-dev php7-gd icu-dev \ php7-zip php7-tidy php7-intl libffi-dev openssl-dev php7-pear rabbitmq-c rabbitmq-c-dev librrd \ libzip-dev rrdtool-dev gmp-dev yaml yaml-dev fann fann-dev openldap-dev librdkafka librdkafka-dev libcurl curl-dev \ - libpng-dev gpgme gpgme-dev aspell-dev + libpng-dev gpgme gpgme-dev aspell-dev libjpeg-turbo-dev libpng-dev libwebp-dev freetype-dev + +RUN docker-php-ext-configure gd --with-freetype-dir=/usr --with-png-dir=/usr --with-webp-dir=/usr --with-jpeg-dir=/usr RUN docker-php-ext-install imap gmp sockets intl gd ldap bz2 mysqli bcmath calendar dba exif gettext opcache pcntl \ pdo_mysql shmop sysvmsg sysvsem sysvshm xml soap pspell diff --git a/tests/DockerImages/7.3/Dockerfile b/tests/DockerImages/7.3/Dockerfile index 307861dcf..0bdc1fa1d 100644 --- a/tests/DockerImages/7.3/Dockerfile +++ b/tests/DockerImages/7.3/Dockerfile @@ -6,7 +6,9 @@ RUN set -eux; \ libmcrypt-dev imap-dev php7-imap enchant2 php8-enchant bzip2-dev gettext-dev libxml2-dev php7-dev php7-gd icu-dev \ php7-zip php7-tidy php7-intl libffi-dev openssl-dev php7-pear rabbitmq-c rabbitmq-c-dev librrd \ libzip-dev rrdtool-dev gmp-dev yaml yaml-dev fann fann-dev openldap-dev librdkafka librdkafka-dev libcurl curl-dev \ - libpng-dev gpgme gpgme-dev libpq-dev aspell-dev + libpng-dev gpgme gpgme-dev libpq-dev aspell-dev libjpeg-turbo-dev libpng-dev libwebp-dev freetype-dev + +RUN docker-php-ext-configure gd --with-freetype-dir=/usr --with-png-dir=/usr --with-webp-dir=/usr --with-jpeg-dir=/usr RUN docker-php-ext-install imap gmp sockets intl gd ldap bz2 mysqli bcmath calendar dba exif gettext opcache pcntl \ pdo_mysql shmop sysvmsg sysvsem sysvshm xml soap pgsql pspell diff --git a/tests/DockerImages/7.4/Dockerfile b/tests/DockerImages/7.4/Dockerfile index d99adbfd3..22f747e60 100644 --- a/tests/DockerImages/7.4/Dockerfile +++ b/tests/DockerImages/7.4/Dockerfile @@ -6,7 +6,9 @@ RUN set -eux; \ libmcrypt-dev imap-dev enchant2 php8-enchant bzip2-dev gettext-dev libxml2-dev icu-dev \ libffi-dev openssl-dev rabbitmq-c rabbitmq-c-dev librrd \ libzip-dev rrdtool-dev gmp-dev yaml yaml-dev fann fann-dev openldap-dev librdkafka librdkafka-dev libcurl curl-dev \ - libpng-dev gpgme gpgme-dev libpq-dev aspell-dev + libpng-dev gpgme gpgme-dev libpq-dev aspell-dev libjpeg-turbo-dev libpng-dev libwebp-dev freetype-dev + +RUN docker-php-ext-configure gd --with-jpeg --with-webp --with-freetype RUN docker-php-ext-install imap gmp sockets intl gd ldap bz2 mysqli bcmath calendar dba exif gettext opcache pcntl \ pdo_mysql shmop sysvmsg sysvsem sysvshm xml soap pgsql pspell diff --git a/tests/DockerImages/8.0/Dockerfile b/tests/DockerImages/8.0/Dockerfile index 709315711..30d3f3f02 100644 --- a/tests/DockerImages/8.0/Dockerfile +++ b/tests/DockerImages/8.0/Dockerfile @@ -6,7 +6,9 @@ RUN set -eux; \ libmcrypt-dev imap-dev php8-imap enchant2 php8-enchant bzip2-dev gettext-dev libxml2-dev php8-dev php8-gd icu-dev \ php8-zip php8-tidy php8-intl libffi-dev openssl-dev php8-pear rabbitmq-c rabbitmq-c-dev librrd \ libzip-dev rrdtool-dev gmp-dev yaml yaml-dev fann fann-dev openldap-dev librdkafka librdkafka-dev libcurl curl-dev \ - libpng-dev gpgme gpgme-dev libpq-dev aspell-dev + libpng-dev gpgme gpgme-dev libpq-dev aspell-dev libjpeg-turbo-dev libpng-dev libwebp-dev freetype-dev + +RUN docker-php-ext-configure gd --with-jpeg --with-webp --with-freetype RUN docker-php-ext-install imap gmp sockets intl gd ldap bz2 mysqli bcmath calendar dba exif gettext opcache pcntl \ pdo_mysql shmop sysvmsg sysvsem sysvshm xml soap pgsql pspell diff --git a/tests/DockerImages/8.1/Dockerfile b/tests/DockerImages/8.1/Dockerfile index d6b728277..c4223ee08 100644 --- a/tests/DockerImages/8.1/Dockerfile +++ b/tests/DockerImages/8.1/Dockerfile @@ -6,7 +6,9 @@ RUN set -eux; \ libmcrypt-dev imap-dev php-imap enchant2 php-enchant bzip2-dev gettext-dev libxml2-dev php81-dev php-gd icu-dev \ php-zip php-tidy php-intl libffi-dev openssl-dev php81-pear rabbitmq-c rabbitmq-c-dev librrd \ libzip-dev rrdtool-dev gmp-dev yaml yaml-dev fann fann-dev openldap-dev librdkafka librdkafka-dev libcurl curl-dev \ - libpng-dev gpgme gpgme-dev libpq-dev aspell-dev + libpng-dev gpgme gpgme-dev libpq-dev aspell-dev libjpeg-turbo-dev libpng-dev libwebp-dev freetype-dev + +RUN docker-php-ext-configure gd --with-jpeg --with-webp --with-freetype RUN docker-php-ext-install imap gmp sockets intl gd ldap bz2 mysqli bcmath calendar dba exif gettext opcache pcntl \ pdo_mysql shmop sysvmsg sysvsem sysvshm xml soap pgsql pspell diff --git a/tests/DockerImages/8.2/Dockerfile b/tests/DockerImages/8.2/Dockerfile index 9d60d7554..010d6c073 100644 --- a/tests/DockerImages/8.2/Dockerfile +++ b/tests/DockerImages/8.2/Dockerfile @@ -6,7 +6,9 @@ RUN set -eux; \ libmcrypt-dev imap-dev php-imap enchant2 php-enchant bzip2-dev gettext-dev libxml2-dev php82-dev php-gd icu-dev \ php-zip php-tidy php-intl libffi-dev openssl-dev php82-pear rabbitmq-c rabbitmq-c-dev librrd \ libzip-dev rrdtool-dev gmp-dev yaml yaml-dev fann fann-dev openldap-dev librdkafka librdkafka-dev libcurl curl-dev \ - libpng-dev gpgme gpgme-dev libpq-dev aspell-dev + libpng-dev gpgme gpgme-dev libpq-dev aspell-dev libjpeg-turbo-dev libpng-dev libwebp-dev freetype-dev + +RUN docker-php-ext-configure gd --with-jpeg --with-webp --with-freetype RUN docker-php-ext-install imap gmp sockets intl gd ldap bz2 mysqli bcmath calendar dba exif gettext opcache pcntl \ pdo_mysql shmop sysvmsg sysvsem sysvshm xml soap pgsql pspell diff --git a/tests/DockerImages/8.3/Dockerfile b/tests/DockerImages/8.3/Dockerfile new file mode 100644 index 000000000..a783329c6 --- /dev/null +++ b/tests/DockerImages/8.3/Dockerfile @@ -0,0 +1,16 @@ +FROM php:8.3.0RC5-alpine + +RUN set -eux; \ + apk add --repository http://dl-cdn.alpinelinux.org/alpine/edge/community --no-cache --virtual .build-deps \ + bash gcc g++ make autoconf pkgconfig git \ + libmcrypt-dev imap-dev php-imap enchant2 php-enchant bzip2-dev gettext-dev libxml2-dev php82-dev php-gd icu-dev \ + php-zip php-tidy php-intl libffi-dev openssl-dev php82-pear rabbitmq-c rabbitmq-c-dev librrd \ + libzip-dev rrdtool-dev gmp-dev yaml yaml-dev fann fann-dev openldap-dev librdkafka librdkafka-dev libcurl curl-dev \ + libpng-dev gpgme gpgme-dev libpq-dev aspell-dev libjpeg-turbo-dev libpng-dev libwebp-dev freetype-dev + +RUN docker-php-ext-configure gd --with-jpeg --with-webp --with-freetype + +RUN docker-php-ext-install imap gmp sockets intl gd ldap bz2 mysqli bcmath calendar dba exif gettext opcache pcntl \ + pdo_mysql shmop sysvmsg sysvsem sysvshm xml soap pgsql pspell + +WORKDIR /opt/project/phpstorm-stubs diff --git a/tests/DockerImages/testRunner/Dockerfile b/tests/DockerImages/testRunner/Dockerfile index fc6b6ed8c..9c724b1e4 100644 --- a/tests/DockerImages/testRunner/Dockerfile +++ b/tests/DockerImages/testRunner/Dockerfile @@ -1,8 +1,26 @@ -FROM php:8.1-apache +FROM php:8.3.0RC1-apache RUN echo 'memory_limit = 1024M' >> /usr/local/etc/php/conf.d/docker-php-memlimit.ini COPY --from=composer /usr/bin/composer /usr/bin/composer RUN apt-get update && apt-get -y install git zip unzip - +RUN apt-get update -y && \ + apt-get install git -y && \ + git clone https://github.com/xdebug/xdebug +WORKDIR xdebug +RUN phpize && \ + chmod +x configure && \ + ./configure --enable-xdebug && \ + make && \ + make install +# Enable xdebug extension +RUN echo "zend_extension=$(php-config --extension-dir)/xdebug.so" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini +#RUN pecl install xdebug +#RUN docker-php-ext-enable xdebug +RUN echo "xdebug.mode=develop,debug,coverage" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini +#RUN echo "xdebug.remote_host=192.168.178.178" >> /usr/local/etc/php/php.ini +RUN echo "xdebug.client_host=host.docker.internal" >> /usr/local/etc/php/php.ini +RUN echo "xdebug.start_with_request=yes" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini +RUN echo "xdebug.output_dir=/opt/project/xdebug_snapshots" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini +RUN echo "xdebug.log=/opt/project/xdebug_logs/xdebug33php82.log" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini WORKDIR /opt/project/phpstorm-stubs diff --git a/tests/Model/BasePHPClass.php b/tests/Model/BasePHPClass.php index fc5a593d2..300ec83c3 100644 --- a/tests/Model/BasePHPClass.php +++ b/tests/Model/BasePHPClass.php @@ -36,6 +36,23 @@ function (PHPConst $nextConstant) use ($parsedConstant) { } } + public function addEnumCase(PHPEnumCase $parsedConstant) + { + if (isset($parsedConstant->name)) { + if (array_key_exists($parsedConstant->name, $this->constants)) { + $amount = count(array_filter( + $this->constants, + function (PHPConst $nextConstant) use ($parsedConstant) { + return $nextConstant->name === $parsedConstant->name; + } + )); + $this->constants[$parsedConstant->name . '_duplicated_' . $amount] = $parsedConstant; + } else { + $this->constants[$parsedConstant->name] = $parsedConstant; + } + } + } + /** * @return PHPConst|null * @throws RuntimeException diff --git a/tests/Model/PHPConst.php b/tests/Model/PHPConst.php index 15cc90679..e1f7247e2 100644 --- a/tests/Model/PHPConst.php +++ b/tests/Model/PHPConst.php @@ -8,6 +8,7 @@ use PhpParser\Node\Expr\ConstFetch; use PhpParser\Node\Expr\UnaryMinus; use PhpParser\Node\Stmt\ClassConst; +use PhpParser\Node\Stmt\Enum_; use PhpParser\Node\Stmt\Namespace_; use PhpParser\NodeAbstract; use ReflectionClassConstant; @@ -107,9 +108,14 @@ protected function getConstValue($node) protected function getConstantFQN(NodeAbstract $node, $nodeName) { $namespace = ''; - $parentParentNode = $node->getAttribute('parent')->getAttribute('parent'); - if ($parentParentNode instanceof Namespace_ && !empty($parentParentNode->name)) { - $namespace = '\\' . implode('\\', $parentParentNode->name->parts) . '\\'; + $parentNode = $node->getAttribute('parent'); + if ($parentNode instanceof Enum_) { + return $nodeName; + } else { + $parentParentNode = $parentNode->getAttribute('parent'); + if ($parentParentNode instanceof Namespace_ && !empty($parentParentNode->name)) { + $namespace = '\\' . implode('\\', $parentParentNode->name->parts) . '\\'; + } } return $namespace . $nodeName; diff --git a/tests/Model/PHPEnum.php b/tests/Model/PHPEnum.php new file mode 100644 index 000000000..0b3096720 --- /dev/null +++ b/tests/Model/PHPEnum.php @@ -0,0 +1,111 @@ +name = $reflectionObject->getName(); + $this->interfaces = $reflectionObject->getInterfaceNames(); + $this->isFinal = $reflectionObject->isFinal(); + if (method_exists($reflectionObject, 'isReadOnly')) { + $this->isReadonly = $reflectionObject->isReadOnly(); + } + foreach ($reflectionObject->getMethods() as $method) { + if ($method->getDeclaringClass()->getName() !== $this->name) { + continue; + } + $parsedMethod = (new PHPMethod())->readObjectFromReflection($method); + $this->addMethod($parsedMethod); + } + + if (method_exists($reflectionObject, 'getReflectionConstants')) { + foreach ($reflectionObject->getReflectionConstants() as $constant) { + if ($constant->getDeclaringClass()->getName() !== $this->name) { + continue; + } + if ($constant->isEnumCase()) { + $enumCase = (new PHPEnumCase())->readObjectFromReflection($constant); + $this->addEnumCase($enumCase); + } else { + $parsedConstant = (new PHPConst())->readObjectFromReflection($constant); + $this->addConstant($parsedConstant); + } + } + } + + foreach ($reflectionObject->getProperties() as $property) { + if ($property->getDeclaringClass()->getName() !== $this->name) { + continue; + } + $parsedProperty = (new PHPProperty())->readObjectFromReflection($property); + $this->addProperty($parsedProperty); + } + + return $this; + } + + /** + * @param Enum_ $node + * @return static + */ + public function readObjectFromStubNode($node) + { + $this->name = self::getFQN($node); + $this->availableVersionsRangeFromAttribute = self::findAvailableVersionsRangeFromAttribute($node->attrGroups); + $this->collectTags($node); + if (!empty($node->extends)) { + $this->parentClass = ''; + foreach ($node->extends->parts as $part) { + $this->parentClass .= "\\$part"; + } + $this->parentClass = ltrim($this->parentClass, "\\"); + } + if (!empty($node->implements)) { + foreach ($node->implements as $interfaceObject) { + $interfaceFQN = ''; + foreach ($interfaceObject->parts as $interface) { + $interfaceFQN .= "\\$interface"; + } + $this->interfaces[] = ltrim($interfaceFQN, "\\"); + } + } + if ($node->getDocComment() !== null) { + $docBlock = DocBlockFactory::createInstance()->create($node->getDocComment()->getText()); + /** @var PropertyRead[] $properties */ + $properties = array_merge( + $docBlock->getTagsByName('property-read'), + $docBlock->getTagsByName('property') + ); + foreach ($properties as $property) { + $propertyName = $property->getVariableName(); + assert($propertyName !== '', "@property name is empty in class $this->name"); + $newProperty = new PHPProperty($this->name); + $newProperty->is_static = false; + $newProperty->access = 'public'; + $newProperty->name = $propertyName; + $newProperty->parentName = $this->name; + $newProperty->typesFromSignature = self::convertParsedTypeToArray($property->getType()); + assert( + !array_key_exists($propertyName, $this->properties), + "Property '$propertyName' is already declared in class '$this->name'" + ); + $this->properties[$propertyName] = $newProperty; + } + } + + return $this; + } + + public function readMutedProblems($jsonData) {} +} diff --git a/tests/Model/PHPEnumCase.php b/tests/Model/PHPEnumCase.php new file mode 100644 index 000000000..ea5bc4e5c --- /dev/null +++ b/tests/Model/PHPEnumCase.php @@ -0,0 +1,45 @@ +name = $reflectionObject->name; + $this->value = $reflectionObject->getValue(); + if ($reflectionObject->isPrivate()) { + $this->visibility = 'private'; + } elseif ($reflectionObject->isProtected()) { + $this->visibility = 'protected'; + } else { + $this->visibility = 'public'; + } + return $this; + } + + /** + * @param EnumCase $node + * @return $this|PHPEnumCase + */ + public function readObjectFromStubNode($node) + { + $this->name = $this->getConstantFQN($node, $node->name->name); + //$this->value = $this->getConstValue($node); + //$this->collectTags($node); + $parentNode = $node->getAttribute('parent'); + if (property_exists($parentNode, 'attrGroups')) { + $this->availableVersionsRangeFromAttribute = self::findAvailableVersionsRangeFromAttribute($parentNode->attrGroups); + } + $this->parentName = self::getFQN($parentNode->namespacedName); + return $this; + } + + public function readMutedProblems($jsonData) {} +} diff --git a/tests/Model/PHPFunction.php b/tests/Model/PHPFunction.php index 5a8219e28..98ac6b679 100644 --- a/tests/Model/PHPFunction.php +++ b/tests/Model/PHPFunction.php @@ -103,6 +103,7 @@ public function readObjectFromStubNode($node) $relatedParamTag = array_pop($relatedParamTags); if ($relatedParamTag !== null) { $parameter->isOptional = $parameter->isOptional || str_contains((string)$relatedParamTag->getDescription(), '[optional]'); + $parameter->markedOptionalInPhpDoc = str_contains((string)$relatedParamTag->getDescription(), '[optional]'); } } diff --git a/tests/Model/PHPMethod.php b/tests/Model/PHPMethod.php index 4526da3a2..da0271664 100644 --- a/tests/Model/PHPMethod.php +++ b/tests/Model/PHPMethod.php @@ -119,6 +119,7 @@ public function readObjectFromStubNode($node) $relatedParamTag = array_pop($relatedParamTags); if ($relatedParamTag !== null) { $parameter->isOptional = $parameter->isOptional || str_contains((string)$relatedParamTag->getDescription(), '[optional]'); + $parameter->markedOptionalInPhpDoc = str_contains((string)$relatedParamTag->getDescription(), '[optional]'); } } diff --git a/tests/Model/PHPParameter.php b/tests/Model/PHPParameter.php index c335996a7..a44585576 100644 --- a/tests/Model/PHPParameter.php +++ b/tests/Model/PHPParameter.php @@ -23,6 +23,8 @@ class PHPParameter extends BasePHPElement public $is_vararg = false; public $is_passed_by_ref = false; public $isOptional = false; + public $isDefaultValueAvailable = false; + public $markedOptionalInPhpDoc = false; public $defaultValue; /** @@ -39,6 +41,7 @@ public function readObjectFromReflection($reflectionObject) $this->is_passed_by_ref = $reflectionObject->isPassedByReference() && !$reflectionObject->canBePassedByValue(); $this->isOptional = $reflectionObject->isOptional(); $this->indexInSignature = $reflectionObject->getPosition(); + $this->isDefaultValueAvailable = $reflectionObject->isDefaultValueAvailable(); if ($reflectionObject->isDefaultValueAvailable()) { $this->defaultValue = $reflectionObject->getDefaultValue(); if (in_array('bool', $this->typesFromSignature, true)) { diff --git a/tests/Model/PhpVersions.php b/tests/Model/PhpVersions.php index f5cafc53b..784dc2903 100644 --- a/tests/Model/PhpVersions.php +++ b/tests/Model/PhpVersions.php @@ -10,7 +10,7 @@ class PhpVersions implements ArrayAccess, IteratorAggregate { - private static $versions = [5.3, 5.4, 5.5, 5.6, 7.0, 7.1, 7.2, 7.3, 7.4, 8.0, 8.1, 8.2]; + private static $versions = [5.3, 5.4, 5.5, 5.6, 7.0, 7.1, 7.2, 7.3, 7.4, 8.0, 8.1, 8.2, 8.3]; public static function getLatest() { diff --git a/tests/Model/StubsContainer.php b/tests/Model/StubsContainer.php index aa93c096c..44d60ef4f 100644 --- a/tests/Model/StubsContainer.php +++ b/tests/Model/StubsContainer.php @@ -28,6 +28,11 @@ class StubsContainer */ private $interfaces = []; + /** + * @var PHPEnum[] + */ + private $enums = []; + /** * @return PHPConst[] */ @@ -188,6 +193,38 @@ public function getClass($name, $sourceFilePath = null, $shouldSuitCurrentPhpVer return null; } + /** + * @param string $name + * @param string|null $sourceFilePath + * @param bool $shouldSuitCurrentPhpVersion + * @return PHPEnum|null + * @throws RuntimeException + */ + public function getEnum($name, $sourceFilePath = null, $shouldSuitCurrentPhpVersion = true) + { + $enums = array_filter($this->enums, function (PHPEnum $enum) use ($shouldSuitCurrentPhpVersion, $name) { + return $enum->name === $name && + (!$shouldSuitCurrentPhpVersion || BasePHPElement::entitySuitsCurrentPhpVersion($enum)); + }); + if (count($enums) === 1) { + return array_pop($enums); + } + + if ($sourceFilePath !== null) { + $enums = array_filter($enums, function (PHPEnum $enum) use ($shouldSuitCurrentPhpVersion, $sourceFilePath) { + return $enum->sourceFilePath === $sourceFilePath && + (!$shouldSuitCurrentPhpVersion || BasePHPElement::entitySuitsCurrentPhpVersion($enum)); + }); + } + if (count($enums) > 1) { + throw new RuntimeException("Multiple enums with name $name found"); + } + if (!empty($enums)) { + return array_pop($enums); + } + return null; + } + /** * @return PHPClass[] */ @@ -255,6 +292,14 @@ public function getInterfaces() return $this->interfaces; } + /** + * @return PHPEnum[] + */ + public function getEnums() + { + return $this->enums; + } + /** * @return PHPInterface[] */ @@ -281,4 +326,21 @@ function (PHPInterface $nextInterface) use ($interface) { } } } + + public function addEnum(PHPEnum $enum) + { + if (isset($enum->name)) { + if (array_key_exists($enum->name, $this->enums)) { + $amount = count(array_filter( + $this->enums, + function (PHPEnum $nextEnum) use ($enum) { + return $nextEnum->name === $enum->name; + } + )); + $this->enums[$enum->name . '_duplicated_' . $amount] = $enum; + } else { + $this->enums[$enum->name] = $enum; + } + } + } } diff --git a/tests/Parsers/PHPReflectionParser.php b/tests/Parsers/PHPReflectionParser.php index dc443b53c..4a6bb9159 100644 --- a/tests/Parsers/PHPReflectionParser.php +++ b/tests/Parsers/PHPReflectionParser.php @@ -7,6 +7,7 @@ use StubTests\Model\CommonUtils; use StubTests\Model\PHPClass; use StubTests\Model\PHPDefineConstant; +use StubTests\Model\PHPEnum; use StubTests\Model\PHPFunction; use StubTests\Model\PHPInterface; use StubTests\Model\StubsContainer; @@ -44,9 +45,15 @@ public static function getStubs() foreach (get_declared_classes() as $clazz) { $reflectionClass = new ReflectionClass($clazz); if ($reflectionClass->isInternal()) { - $class = (new PHPClass())->readObjectFromReflection($reflectionClass); - $class->readMutedProblems($jsonData->classes); - $stubs->addClass($class); + if (method_exists($reflectionClass, 'isEnum') && $reflectionClass->isEnum()) { + $enum = (new PHPEnum())->readObjectFromReflection($reflectionClass); + $enum->readMutedProblems($jsonData->enums); + $stubs->addEnum($enum); + } else { + $class = (new PHPClass())->readObjectFromReflection($reflectionClass); + $class->readMutedProblems($jsonData->classes); + $stubs->addClass($class); + } } } diff --git a/tests/Parsers/ParserUtils.php b/tests/Parsers/ParserUtils.php index c29b1db8c..a2b3b66d3 100644 --- a/tests/Parsers/ParserUtils.php +++ b/tests/Parsers/ParserUtils.php @@ -122,7 +122,10 @@ private static function getLatestAvailableVersionFromPhpDoc(BasePHPElement $elem */ private static function getSinceVersionsFromParentClass(PHPMethod|PHPConst $element): array { - $parentClass = PhpStormStubsSingleton::getPhpStormStubs()->getClass($element->parentName, shouldSuitCurrentPhpVersion: false); + $parentClass = PhpStormStubsSingleton::getPhpStormStubs()->getEnum($element->parentName, shouldSuitCurrentPhpVersion: false); + if ($parentClass === null) { + $parentClass = PhpStormStubsSingleton::getPhpStormStubs()->getClass($element->parentName, shouldSuitCurrentPhpVersion: false); + } if ($parentClass === null) { $parentClass = PhpStormStubsSingleton::getPhpStormStubs()->getInterface($element->parentName, shouldSuitCurrentPhpVersion: false); } @@ -137,7 +140,10 @@ private static function getSinceVersionsFromParentClass(PHPMethod|PHPConst $elem */ public static function getLatestAvailableVersionsFromParentClass(PHPMethod|PHPConst $element): array { - $parentClass = PhpStormStubsSingleton::getPhpStormStubs()->getClass($element->parentName, shouldSuitCurrentPhpVersion: false); + $parentClass = PhpStormStubsSingleton::getPhpStormStubs()->getEnum($element->parentName, shouldSuitCurrentPhpVersion: false); + if ($parentClass === null) { + $parentClass = PhpStormStubsSingleton::getPhpStormStubs()->getClass($element->parentName, shouldSuitCurrentPhpVersion: false); + } if ($parentClass === null) { $parentClass = PhpStormStubsSingleton::getPhpStormStubs()->getInterface($element->parentName, shouldSuitCurrentPhpVersion: false); } diff --git a/tests/Parsers/Visitors/ASTVisitor.php b/tests/Parsers/Visitors/ASTVisitor.php index 95ea11494..4a83ef45d 100644 --- a/tests/Parsers/Visitors/ASTVisitor.php +++ b/tests/Parsers/Visitors/ASTVisitor.php @@ -8,6 +8,7 @@ use PhpParser\Node\Const_; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Stmt\Class_; +use PhpParser\Node\Stmt\Enum_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Interface_; @@ -17,6 +18,8 @@ use StubTests\Model\PHPClass; use StubTests\Model\PHPConst; use StubTests\Model\PHPDefineConstant; +use StubTests\Model\PHPEnum; +use StubTests\Model\PHPEnumCase; use StubTests\Model\PHPFunction; use StubTests\Model\PHPInterface; use StubTests\Model\PHPMethod; @@ -43,6 +46,15 @@ public function enterNode(Node $node): void $function->stubBelongsToCore = true; } $this->stubs->addFunction($function); + } elseif ($node instanceof Node\Stmt\EnumCase) { + $constant = (new PHPEnumCase())->readObjectFromStubNode($node); + $constant->sourceFilePath = $this->sourceFilePath; + if ($this->isStubCore) { + $constant->stubBelongsToCore = true; + } + if ($this->stubs->getEnum($constant->parentName, $this->sourceFilePath, false) !== null) { + $this->stubs->getEnum($constant->parentName, $this->sourceFilePath, false)->addEnumCase($constant); + } } elseif ($node instanceof Const_) { $constant = (new PHPConst())->readObjectFromStubNode($node); $constant->sourceFilePath = $this->sourceFilePath; @@ -51,6 +63,8 @@ public function enterNode(Node $node): void } if ($constant->parentName === null) { $this->stubs->addConstant($constant); + } elseif ($this->stubs->getEnum($constant->parentName, $this->sourceFilePath, false) !== null) { + $this->stubs->getEnum($constant->parentName, $this->sourceFilePath, false)->addConstant($constant); } elseif ($this->stubs->getClass($constant->parentName, $this->sourceFilePath, false) !== null) { $this->stubs->getClass($constant->parentName, $this->sourceFilePath, false)->addConstant($constant); } elseif ($this->stubs->getInterface($constant->parentName, $this->sourceFilePath, false) !== null) { @@ -71,7 +85,10 @@ public function enterNode(Node $node): void if ($this->isStubCore) { $method->stubBelongsToCore = true; } - if ($this->stubs->getClass($method->parentName, $this->sourceFilePath, false) !== null) { + if ($this->stubs->getEnum($method->parentName, $this->sourceFilePath, false) !== null) { + $this->stubs->getEnum($method->parentName, $this->sourceFilePath, false)->addMethod($method); + } + elseif ($this->stubs->getClass($method->parentName, $this->sourceFilePath, false) !== null) { $this->stubs->getClass($method->parentName, $this->sourceFilePath, false)->addMethod($method); } elseif ($this->stubs->getInterface($method->parentName, $this->sourceFilePath, false) !== null) { $this->stubs->getInterface($method->parentName, $this->sourceFilePath, false)->addMethod($method); @@ -90,6 +107,13 @@ public function enterNode(Node $node): void $class->stubBelongsToCore = true; } $this->stubs->addClass($class); + } elseif ($node instanceof Enum_) { + $enum = (new PHPEnum())->readObjectFromStubNode($node); + $enum->sourceFilePath = $this->sourceFilePath; + if ($this->isStubCore) { + $enum->stubBelongsToCore = true; + } + $this->stubs->addEnum($enum); } elseif ($node instanceof Node\Stmt\Property) { $property = (new PHPProperty())->readObjectFromStubNode($node); $property->sourceFilePath = $this->sourceFilePath; diff --git a/tests/StubsConstantsAndParametersValuesTest.php b/tests/StubsConstantsAndParametersValuesTest.php index 6498e3240..f01db390d 100644 --- a/tests/StubsConstantsAndParametersValuesTest.php +++ b/tests/StubsConstantsAndParametersValuesTest.php @@ -7,6 +7,7 @@ use RuntimeException; use StubTests\Model\PHPClass; use StubTests\Model\PHPConst; +use StubTests\Model\PHPEnum; use StubTests\Model\PHPFunction; use StubTests\Model\PHPInterface; use StubTests\Model\PHPMethod; @@ -56,13 +57,44 @@ public function testFunctionsDefaultParametersValue(PHPFunction $function, PHPPa ); } + /** + * @dataProvider \StubTests\TestData\Providers\Reflection\ReflectionParametersProvider::functionOptionalParametersWithoutDefaultValueProvider + * @throws Exception|RuntimeException + */ + public function testFunctionsWithoutOptionalDefaultParametersValue(PHPFunction $function, PHPParameter $parameter) + { + $phpstormFunction = PhpStormStubsSingleton::getPhpStormStubs()->getFunction($function->name); + $stubParameters = array_filter($phpstormFunction->parameters, fn (PHPParameter $stubParameter) => $stubParameter->indexInSignature === $parameter->indexInSignature); + /** @var PHPParameter $stubOptionalParameter */ + $stubOptionalParameter = array_pop($stubParameters); + + self::assertTrue( + empty($stubOptionalParameter->defaultValue), + sprintf( + 'Stub function "%s" has a parameter "%s" which expected to have no default value but it has', + $function->name, + $stubOptionalParameter->name + ) + ); + self::assertTrue( + $stubOptionalParameter->markedOptionalInPhpDoc, + sprintf( + 'Stub function "%s" has a parameter "%s" which expected to be marked as [optional] at PHPDoc but it is not', + $function->name, + $stubOptionalParameter->name + ) + ); + } + /** * @dataProvider \StubTests\TestData\Providers\Reflection\ReflectionParametersProvider::methodOptionalParametersWithDefaultValueProvider * @throws Exception|RuntimeException */ public function testMethodsDefaultParametersValue(PHPClass|PHPInterface $class, PHPMethod $method, PHPParameter $parameter) { - if ($class instanceof PHPClass) { + if ($class instanceof PHPEnum) { + $phpstormFunction = PhpStormStubsSingleton::getPhpStormStubs()->getEnum($class->name)->getMethod($method->name); + } elseif ($class instanceof PHPClass) { $phpstormFunction = PhpStormStubsSingleton::getPhpStormStubs()->getClass($class->name)->getMethod($method->name); } else { $phpstormFunction = PhpStormStubsSingleton::getPhpStormStubs()->getInterface($class->name)->getMethod($method->name); @@ -85,4 +117,41 @@ public function testMethodsDefaultParametersValue(PHPClass|PHPInterface $class, ) ); } + + /** + * @dataProvider \StubTests\TestData\Providers\Reflection\ReflectionParametersProvider::methodOptionalParametersWithoutDefaultValueProvider + * @throws Exception|RuntimeException + */ + public function testMethodsWithoutOptionalDefaultParametersValue(PHPClass|PHPInterface $class, PHPMethod $method, PHPParameter $parameter) + { + if ($class instanceof PHPEnum) { + $phpstormFunction = PhpStormStubsSingleton::getPhpStormStubs()->getEnum($class->name)->getMethod($method->name); + } elseif ($class instanceof PHPClass) { + $phpstormFunction = PhpStormStubsSingleton::getPhpStormStubs()->getClass($class->name)->getMethod($method->name); + } else { + $phpstormFunction = PhpStormStubsSingleton::getPhpStormStubs()->getInterface($class->name)->getMethod($method->name); + } + $stubParameters = array_filter($phpstormFunction->parameters, fn (PHPParameter $stubParameter) => $stubParameter->indexInSignature === $parameter->indexInSignature); + /** @var PHPParameter $stubOptionalParameter */ + $stubOptionalParameter = array_pop($stubParameters); + + self::assertTrue( + empty($stubOptionalParameter->defaultValue), + sprintf( + 'Stub method %s::%s has a parameter "%s" which expected to have no default value but it has', + $class->name, + $method->name, + $stubOptionalParameter->name + ) + ); + self::assertTrue( + $stubOptionalParameter->markedOptionalInPhpDoc, + sprintf( + 'Stub method %s::%s has a parameter "%s" which expected to be marked as [optional] at PHPDoc but it is not', + $class->name, + $method->name, + $stubOptionalParameter->name + ) + ); + } } diff --git a/tests/StubsTypeHintsTest.php b/tests/StubsTypeHintsTest.php index 9b152a395..5b84b6123 100644 --- a/tests/StubsTypeHintsTest.php +++ b/tests/StubsTypeHintsTest.php @@ -6,6 +6,7 @@ use PHPUnit\Framework\Exception; use RuntimeException; use StubTests\Model\PHPClass; +use StubTests\Model\PHPEnum; use StubTests\Model\PHPFunction; use StubTests\Model\PHPInterface; use StubTests\Model\PHPMethod; @@ -85,7 +86,9 @@ public function testFunctionsParametersTypeHints(PHPFunction $function, PHPParam public function testMethodsReturnTypeHints(PHPClass|PHPInterface $class, PHPMethod $method) { $functionName = $method->name; - if ($class instanceof PHPClass) { + if ($class instanceof PHPEnum) { + $stubMethod = PhpStormStubsSingleton::getPhpStormStubs()->getEnum($class->name)->getMethod($method->name); + } elseif ($class instanceof PHPClass) { $stubMethod = PhpStormStubsSingleton::getPhpStormStubs()->getClass($class->name)->getMethod($functionName); } else { $stubMethod = PhpStormStubsSingleton::getPhpStormStubs()->getInterface($class->name)->getMethod($functionName); diff --git a/tests/TestData/Providers/Reflection/ReflectionMethodsProvider.php b/tests/TestData/Providers/Reflection/ReflectionMethodsProvider.php index 0f036174b..56015c4e0 100644 --- a/tests/TestData/Providers/Reflection/ReflectionMethodsProvider.php +++ b/tests/TestData/Providers/Reflection/ReflectionMethodsProvider.php @@ -47,7 +47,8 @@ public static function classMethodsWithParametersProvider(): ?Generator public static function classMethodsWithoutTentitiveReturnTypeProvider(): ?Generator { $classesAndInterfaces = ReflectionStubsSingleton::getReflectionStubs()->getClasses() + - ReflectionStubsSingleton::getReflectionStubs()->getInterfaces(); + ReflectionStubsSingleton::getReflectionStubs()->getInterfaces() + + ReflectionStubsSingleton::getReflectionStubs()->getEnums(); foreach (EntitiesFilter::getFiltered($classesAndInterfaces) as $class) { foreach (EntitiesFilter::getFiltered( $class->methods, @@ -64,7 +65,8 @@ public static function classMethodsWithoutTentitiveReturnTypeProvider(): ?Genera public static function classMethodsWithTentitiveReturnTypeProvider(): ?Generator { $classesAndInterfaces = ReflectionStubsSingleton::getReflectionStubs()->getClasses() + - ReflectionStubsSingleton::getReflectionStubs()->getInterfaces(); + ReflectionStubsSingleton::getReflectionStubs()->getInterfaces() + + ReflectionStubsSingleton::getReflectionStubs()->getEnums(); foreach (EntitiesFilter::getFiltered($classesAndInterfaces) as $class) { foreach (EntitiesFilter::getFiltered( $class->methods, @@ -81,7 +83,8 @@ public static function classMethodsWithTentitiveReturnTypeProvider(): ?Generator private static function yieldFilteredMethods(int ...$problemTypes): ?Generator { $classesAndInterfaces = ReflectionStubsSingleton::getReflectionStubs()->getClasses() + - ReflectionStubsSingleton::getReflectionStubs()->getInterfaces(); + ReflectionStubsSingleton::getReflectionStubs()->getInterfaces() + + ReflectionStubsSingleton::getReflectionStubs()->getEnums(); foreach (EntitiesFilter::getFiltered($classesAndInterfaces) as $class) { foreach (EntitiesFilter::getFiltered($class->methods, null, ...$problemTypes) as $method) { yield "Method $class->name::$method->name" => [$class, $method]; diff --git a/tests/TestData/Providers/Reflection/ReflectionParametersProvider.php b/tests/TestData/Providers/Reflection/ReflectionParametersProvider.php index 751563825..d5bea6f2b 100644 --- a/tests/TestData/Providers/Reflection/ReflectionParametersProvider.php +++ b/tests/TestData/Providers/Reflection/ReflectionParametersProvider.php @@ -63,6 +63,19 @@ public static function functionOptionalParametersWithDefaultValueProvider(): ?Ge } } + public static function functionOptionalParametersWithoutDefaultValueProvider(): ?Generator + { + foreach (EntitiesFilter::getFilteredFunctions() as $function) { + foreach (EntitiesFilter::getFilteredParameters( + $function, + fn (PHPParameter $parameter) => !$parameter->isOptional || $parameter->isDefaultValueAvailable || $parameter->is_vararg, + StubProblemType::WRONG_PARAMETER_DEFAULT_VALUE + ) as $parameter) { + yield "$function->name($parameter->name)" => [$function, $parameter]; + } + } + } + public static function methodParametersProvider(): ?Generator { $classesAndInterfaces = ReflectionStubsSingleton::getReflectionStubs()->getClasses() + @@ -129,7 +142,27 @@ public static function methodOptionalParametersWithDefaultValueProvider(): ?Gene foreach (EntitiesFilter::getFilteredFunctions($class) as $method) { foreach (EntitiesFilter::getFilteredParameters( $method, - fn (PHPParameter $parameter) => !$parameter->isOptional || empty($parameter->defaultValue), + fn (PHPParameter $parameter) => !$parameter->isOptional || !$parameter->isDefaultValueAvailable, + StubProblemType::WRONG_PARAMETER_DEFAULT_VALUE + ) as $parameter) { + yield "$class->name::$method->name($parameter->name)" => [$class, $method, $parameter]; + } + } + } + } + } + + public static function methodOptionalParametersWithoutDefaultValueProvider(): ?Generator + { + $classesAndInterfaces = ReflectionStubsSingleton::getReflectionStubs()->getClasses() + + ReflectionStubsSingleton::getReflectionStubs()->getInterfaces(); + foreach (EntitiesFilter::getFiltered($classesAndInterfaces) as $class) { + //exclude classes from PHPReflectionParser + if (strncmp($class->name, 'PHP', 3) !== 0) { + foreach (EntitiesFilter::getFilteredFunctions($class) as $method) { + foreach (EntitiesFilter::getFilteredParameters( + $method, + fn (PHPParameter $parameter) => !$parameter->isOptional || $parameter->isDefaultValueAvailable || $parameter->is_vararg, StubProblemType::WRONG_PARAMETER_DEFAULT_VALUE ) as $parameter) { yield "$class->name::$method->name($parameter->name)" => [$class, $method, $parameter]; diff --git a/tests/TestData/Providers/Stubs/PhpCoreStubsProvider.php b/tests/TestData/Providers/Stubs/PhpCoreStubsProvider.php index c99ce26c3..569de516c 100644 --- a/tests/TestData/Providers/Stubs/PhpCoreStubsProvider.php +++ b/tests/TestData/Providers/Stubs/PhpCoreStubsProvider.php @@ -124,6 +124,7 @@ class PhpCoreStubsProvider 'mysql_xdevapi', 'ncurses', 'oauth', + 'opentelemetry', 'pam', 'parallel', 'Parle', diff --git a/tests/TestData/mutedProblems.json b/tests/TestData/mutedProblems.json index afb9962a4..e39bc1607 100644 --- a/tests/TestData/mutedProblems.json +++ b/tests/TestData/mutedProblems.json @@ -799,129 +799,6 @@ } ] }, - { - "name": "timezone_transitions_get", - "parameters": [ - { - "name": "timestampBegin", - "problems": [ - { - "description": "wrong default value", - "versions": [ - "ALL" - ] - } - ] - }, - { - "name": "timestampEnd", - "problems": [ - { - "description": "wrong default value", - "versions": [ - "ALL" - ] - } - ] - } - ] - }, - { - "name": "mb_encode_mimeheader", - "parameters": [ - { - "name": "newline", - "problems": [ - { - "description": "wrong default value", - "versions": [ - "ALL" - ] - } - ] - } - ] - }, - { - "name": "trim", - "parameters": [ - { - "name": "characters", - "problems": [ - { - "description": "wrong default value", - "versions": [ - "ALL" - ] - } - ] - } - ] - }, - { - "name": "rtrim", - "parameters": [ - { - "name": "characters", - "problems": [ - { - "description": "wrong default value", - "versions": [ - "ALL" - ] - } - ] - } - ] - }, - { - "name": "chop", - "parameters": [ - { - "name": "characters", - "problems": [ - { - "description": "wrong default value", - "versions": [ - "ALL" - ] - } - ] - } - ] - }, - { - "name": "ltrim", - "parameters": [ - { - "name": "characters", - "problems": [ - { - "description": "wrong default value", - "versions": [ - "ALL" - ] - } - ] - } - ] - }, - { - "name": "explode", - "parameters": [ - { - "name": "limit", - "problems": [ - { - "description": "wrong default value", - "versions": [ - "ALL" - ] - } - ] - } - ] - }, { "name": "bcdiv", "problems": [ @@ -1052,6 +929,17 @@ ] } ] + }, + { + "name": "hash_pbkdf2", + "problems": [ + { + "description": "parameter mismatch", + "versions": [ + 8.2 + ] + } + ] } ], "classes": [ @@ -1153,7 +1041,8 @@ "versions": [ 8.0, 8.1, - 8.2 + 8.2, + 8.3 ] } ], @@ -1809,44 +1698,12 @@ ] } ] - }, - { - "name": "__construct", - "parameters": [ - { - "name": "flags", - "problems": [ - { - "description": "wrong default value", - "versions": [ - "ALL" - ] - } - ] - } - ] } ] }, { "name": "PharData", "methods": [ - { - "name": "__construct", - "parameters": [ - { - "name": "flags", - "problems": [ - { - "description": "wrong default value", - "versions": [ - "ALL" - ] - } - ] - } - ] - }, { "name": "__destruct", "problems": [ @@ -2710,75 +2567,6 @@ ] } ] - }, - { - "name": "getTransitions", - "parameters": [ - { - "name": "timestampBegin", - "problems": [ - { - "description": "wrong default value", - "versions": [ - "ALL" - ] - } - ] - }, - { - "name": "timestampEnd", - "problems": [ - { - "description": "wrong default value", - "versions": [ - "ALL" - ] - } - ] - } - ] - } - ] - }, - { - "name": "RecursiveCachingIterator", - "methods": [ - { - "name": "__construct", - "parameters": [ - { - "name": "flags", - "problems": [ - { - "description": "wrong default value", - "versions": [ - "ALL" - ] - } - ] - } - ] - } - ] - }, - { - "name": "RecursiveTreeIterator", - "methods": [ - { - "name": "__construct", - "parameters": [ - { - "name": "mode", - "problems": [ - { - "description": "wrong default value", - "versions": [ - "ALL" - ] - } - ] - } - ] } ] }, @@ -2803,27 +2591,6 @@ } ] }, - { - "name": "MultipleIterator", - "methods": [ - { - "name": "__construct", - "parameters": [ - { - "name": "flags", - "problems": [ - { - "description": "wrong default value", - "versions": [ - "ALL" - ] - } - ] - } - ] - } - ] - }, { "name": "DateInterval", "methods": [ @@ -3214,7 +2981,8 @@ "versions": [ 8.0, 8.1, - 8.2 + 8.2, + 8.3 ] } ] @@ -3241,7 +3009,8 @@ "versions": [ 8.0, 8.1, - 8.2 + 8.2, + 8.3 ] } ] @@ -3331,5 +3100,6 @@ } ] } - ] + ], + "enums": [] } diff --git a/tests/Tools/generate-stub-map b/tests/Tools/generate-stub-map index c1e406d46..e3a528233 100644 --- a/tests/Tools/generate-stub-map +++ b/tests/Tools/generate-stub-map @@ -271,6 +271,8 @@ namespace JetBrains\PHPStormStub; */ final class PhpStormStubsMap { +const DIR = __DIR__; + const CLASSES = {$exportedClasses}; const FUNCTIONS = {$exportedFunctions}; diff --git a/tokenizer/tokenizer.php b/tokenizer/tokenizer.php index d4aaf82c9..56a20a9ca 100644 --- a/tokenizer/tokenizer.php +++ b/tokenizer/tokenizer.php @@ -43,193 +43,190 @@ function token_get_all(string $code, #[PhpStormStubsElementAvailable(from: '7.0' function token_name(int $id): string {} define('TOKEN_PARSE', 1); -define('T_REQUIRE_ONCE', 276); -define('T_REQUIRE', 275); -define('T_EVAL', 274); -define('T_INCLUDE_ONCE', 273); -define('T_INCLUDE', 272); -define('T_LOGICAL_OR', 277); -define('T_LOGICAL_XOR', 278); -define('T_LOGICAL_AND', 279); -define('T_PRINT', 280); -define('T_YIELD', 281); -define('T_DOUBLE_ARROW', 386); -define('T_YIELD_FROM', 282); -define('T_POW_EQUAL', 402); -define('T_SR_EQUAL', 362); -define('T_SL_EQUAL', 361); -define('T_XOR_EQUAL', 360); -define('T_OR_EQUAL', 359); -define('T_AND_EQUAL', 358); -define('T_MOD_EQUAL', 357); -define('T_CONCAT_EQUAL', 356); -define('T_DIV_EQUAL', 355); -define('T_MUL_EQUAL', 354); -define('T_MINUS_EQUAL', 353); -define('T_PLUS_EQUAL', 352); +define('T_REQUIRE_ONCE', 263); +define('T_REQUIRE', 262); +define('T_EVAL', 323); +define('T_INCLUDE_ONCE', 261); +define('T_INCLUDE', 260); +define('T_LOGICAL_OR', 264); +define('T_LOGICAL_XOR', 265); +define('T_LOGICAL_AND', 266); +define('T_PRINT', 267); +define('T_YIELD', 268); +define('T_DOUBLE_ARROW', 269); +define('T_YIELD_FROM', 270); +define('T_POW_EQUAL', 282); +define('T_SR_EQUAL', 281); +define('T_SL_EQUAL', 280); +define('T_XOR_EQUAL', 279); +define('T_OR_EQUAL', 278); +define('T_AND_EQUAL', 277); +define('T_MOD_EQUAL', 276); +define('T_CONCAT_EQUAL', 275); +define('T_DIV_EQUAL', 274); +define('T_MUL_EQUAL', 273); +define('T_MINUS_EQUAL', 272); +define('T_PLUS_EQUAL', 271); /** * @since 7.4 */ -define('T_COALESCE_EQUAL', 363); -define('T_COALESCE', 400); -define('T_BOOLEAN_OR', 364); -define('T_BOOLEAN_AND', 365); -define('T_SPACESHIP', 372); -define('T_IS_NOT_IDENTICAL', 369); -define('T_IS_IDENTICAL', 368); -define('T_IS_NOT_EQUAL', 367); -define('T_IS_EQUAL', 366); -define('T_IS_GREATER_OR_EQUAL', 371); -define('T_IS_SMALLER_OR_EQUAL', 370); -define('T_SR', 374); -define('T_SL', 373); -define('T_INSTANCEOF', 283); -define('T_UNSET_CAST', 383); -define('T_BOOL_CAST', 382); -define('T_OBJECT_CAST', 381); -define('T_ARRAY_CAST', 380); -define('T_STRING_CAST', 379); -define('T_DOUBLE_CAST', 378); -define('T_INT_CAST', 377); -define('T_DEC', 376); -define('T_INC', 375); -define('T_POW', 401); -define('T_CLONE', 285); -define('T_NEW', 284); -define('T_ELSEIF', 288); -define('T_ELSE', 289); -define('T_ENDIF', 290); -define('T_PUBLIC', 326); -define('T_PROTECTED', 325); -define('T_PRIVATE', 324); -define('T_FINAL', 323); -define('T_ABSTRACT', 322); -define('T_STATIC', 321); -define('T_LNUMBER', 260); -define('T_DNUMBER', 261); -define('T_STRING', 262); -define('T_VARIABLE', 266); -define('T_INLINE_HTML', 267); -define('T_ENCAPSED_AND_WHITESPACE', 268); -define('T_CONSTANT_ENCAPSED_STRING', 269); -define('T_STRING_VARNAME', 270); -define('T_NUM_STRING', 271); -define('T_EXIT', 286); -define('T_IF', 287); -define('T_ECHO', 291); -define('T_DO', 292); -define('T_WHILE', 293); -define('T_ENDWHILE', 294); -define('T_FOR', 295); -define('T_ENDFOR', 296); -define('T_FOREACH', 297); -define('T_ENDFOREACH', 298); -define('T_DECLARE', 299); -define('T_ENDDECLARE', 300); -define('T_AS', 301); -define('T_SWITCH', 302); -define('T_ENDSWITCH', 303); -define('T_CASE', 304); -define('T_DEFAULT', 305); -define('T_MATCH', 306); -define('T_BREAK', 307); -define('T_CONTINUE', 308); -define('T_GOTO', 309); -define('T_FUNCTION', 310); -define('T_CONST', 312); -define('T_RETURN', 313); -define('T_TRY', 314); -define('T_CATCH', 315); -define('T_FINALLY', 316); -define('T_THROW', 317); -define('T_USE', 318); -define('T_INSTEADOF', 319); -define('T_GLOBAL', 320); -define('T_VAR', 328); -define('T_UNSET', 329); -define('T_ISSET', 330); -define('T_EMPTY', 331); -define('T_HALT_COMPILER', 332); -define('T_CLASS', 333); -define('T_TRAIT', 334); -define('T_INTERFACE', 335); +define('T_COALESCE_EQUAL', 283); +define('T_COALESCE', 284); +define('T_BOOLEAN_OR', 285); +define('T_BOOLEAN_AND', 286); +define('T_SPACESHIP', 293); +define('T_IS_NOT_IDENTICAL', 292); +define('T_IS_IDENTICAL', 291); +define('T_IS_NOT_EQUAL', 290); +define('T_IS_EQUAL', 289); +define('T_IS_GREATER_OR_EQUAL', 295); +define('T_IS_SMALLER_OR_EQUAL', 294); +define('T_SR', 297); +define('T_SL', 296); +define('T_INSTANCEOF', 298); +define('T_UNSET_CAST', 305); +define('T_BOOL_CAST', 304); +define('T_OBJECT_CAST', 303); +define('T_ARRAY_CAST', 302); +define('T_STRING_CAST', 301); +define('T_DOUBLE_CAST', 300); +define('T_INT_CAST', 299); +define('T_DEC', 389); +define('T_INC', 388); +define('T_POW', 306); +define('T_CLONE', 307); +define('T_NEW', 324); +define('T_ELSEIF', 309); +define('T_ELSE', 310); +define('T_ENDIF', 327); +define('T_PUBLIC', 362); +define('T_PROTECTED', 361); +define('T_PRIVATE', 360); +define('T_FINAL', 359); +define('T_ABSTRACT', 358); +define('T_STATIC', 357); +define('T_LNUMBER', 311); +define('T_DNUMBER', 312); +define('T_STRING', 313); +define('T_VARIABLE', 317); +define('T_INLINE_HTML', 318); +define('T_ENCAPSED_AND_WHITESPACE', 319); +define('T_CONSTANT_ENCAPSED_STRING', 320); +define('T_STRING_VARNAME', 321); +define('T_NUM_STRING', 322); +define('T_EXIT', 325); +define('T_IF', 326); +define('T_ECHO', 328); +define('T_DO', 329); +define('T_WHILE', 330); +define('T_ENDWHILE', 331); +define('T_FOR', 332); +define('T_ENDFOR', 333); +define('T_FOREACH', 334); +define('T_ENDFOREACH', 335); +define('T_DECLARE', 336); +define('T_ENDDECLARE', 337); +define('T_AS', 338); +define('T_SWITCH', 339); +define('T_ENDSWITCH', 340); +define('T_CASE', 341); +define('T_DEFAULT', 342); +define('T_MATCH', 343); +define('T_BREAK', 344); +define('T_CONTINUE', 345); +define('T_GOTO', 346); +define('T_FUNCTION', 347); +define('T_CONST', 349); +define('T_RETURN', 350); +define('T_TRY', 351); +define('T_CATCH', 352); +define('T_FINALLY', 353); +define('T_THROW', 258); +define('T_USE', 354); +define('T_INSTEADOF', 355); +define('T_GLOBAL', 356); +define('T_VAR', 364); +define('T_UNSET', 365); +define('T_ISSET', 366); +define('T_EMPTY', 367); +define('T_HALT_COMPILER', 368); +define('T_CLASS', 369); +define('T_TRAIT', 370); +define('T_INTERFACE', 371); /** * @since 8.1 */ -define('T_ENUM', 336); -define('T_EXTENDS', 337); -define('T_IMPLEMENTS', 338); -define('T_OBJECT_OPERATOR', 384); -define('T_LIST', 340); -define('T_ARRAY', 341); -define('T_CALLABLE', 342); -define('T_LINE', 343); -define('T_FILE', 344); -define('T_DIR', 345); -define('T_CLASS_C', 346); -define('T_TRAIT_C', 347); -define('T_METHOD_C', 348); -define('T_FUNC_C', 349); -define('T_COMMENT', 387); -define('T_DOC_COMMENT', 388); -define('T_OPEN_TAG', 389); -define('T_OPEN_TAG_WITH_ECHO', 390); -define('T_CLOSE_TAG', 391); -define('T_WHITESPACE', 392); -define('T_START_HEREDOC', 393); -define('T_END_HEREDOC', 394); -define('T_DOLLAR_OPEN_CURLY_BRACES', 395); -define('T_CURLY_OPEN', 396); -define('T_PAAMAYIM_NEKUDOTAYIM', 397); -define('T_NAMESPACE', 339); -define('T_NS_C', 350); -define('T_NS_SEPARATOR', 398); -define('T_ELLIPSIS', 399); -define('T_DOUBLE_COLON', 397); +define('T_ENUM', 372); +define('T_EXTENDS', 373); +define('T_IMPLEMENTS', 374); +define('T_OBJECT_OPERATOR', 390); +define('T_LIST', 376); +define('T_ARRAY', 377); +define('T_CALLABLE', 378); +define('T_LINE', 379); +define('T_FILE', 380); +define('T_DIR', 381); +define('T_CLASS_C', 382); +define('T_TRAIT_C', 383); +define('T_METHOD_C', 384); +define('T_FUNC_C', 385); +define('T_COMMENT', 392); +define('T_DOC_COMMENT', 393); +define('T_OPEN_TAG', 394); +define('T_OPEN_TAG_WITH_ECHO', 395); +define('T_CLOSE_TAG', 396); +define('T_WHITESPACE', 397); +define('T_START_HEREDOC', 398); +define('T_END_HEREDOC', 399); +define('T_DOLLAR_OPEN_CURLY_BRACES', 400); +define('T_CURLY_OPEN', 401); +define('T_PAAMAYIM_NEKUDOTAYIM', 402); +define('T_NAMESPACE', 375); +define('T_NS_C', 386); +define('T_NS_SEPARATOR', 403); +define('T_ELLIPSIS', 404); +define('T_DOUBLE_COLON', 402); /** * @since 7.4 */ -define('T_FN', 311); -/** - * @removed 7.0 - */ +define('T_FN', 348); define('T_BAD_CHARACTER', 405); /** * @since 8.0 */ -define('T_NAME_FULLY_QUALIFIED', 263); +define('T_NAME_FULLY_QUALIFIED', 314); /** * @since 8.0 */ -define('T_NAME_RELATIVE', 264); +define('T_NAME_RELATIVE', 315); /** * @since 8.0 */ -define('T_NAME_QUALIFIED', 265); +define('T_NAME_QUALIFIED', 316); /** * @since 8.0 */ -define('T_ATTRIBUTE', 351); +define('T_ATTRIBUTE', 387); /** * @since 8.0 */ -define('T_NULLSAFE_OBJECT_OPERATOR', 385); +define('T_NULLSAFE_OBJECT_OPERATOR', 391); /** * @since 8.1 */ -define('T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG', 403); +define('T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG', 288); /** * @since 8.1 */ -define('T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG', 404); +define('T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG', 287); /** * @since 8.1 */ -define('T_READONLY', 327); +define('T_READONLY', 363); /** * @removed 7.0 diff --git a/xdebug/xdebug.php b/xdebug/xdebug.php index e4e68a8ad..c4e4b55db 100644 --- a/xdebug/xdebug.php +++ b/xdebug/xdebug.php @@ -3,7 +3,7 @@ /** * Show diagnostic information */ -function xdebug_info(string $category = '') {} +function xdebug_info(string $category = 'null') {} /** * Returns an array of ALL valid ini options with values and is not the same as ini_get_all() which returns only diff --git a/xml/xml.php b/xml/xml.php index 5d22a2a91..a66b10028 100644 --- a/xml/xml.php +++ b/xml/xml.php @@ -371,7 +371,8 @@ function xml_parse(#[LanguageLevelTypeAware(["8.0" => "XMLParser"], default: "re * success. This is not the same as FALSE and TRUE, be careful with * operators such as ===. */ -function xml_parse_into_struct(#[LanguageLevelTypeAware(["8.0" => "XMLParser"], default: "resource")] $parser, string $data, &$values, &$index): int {} +#[LanguageLevelTypeAware(['8.1' => 'int|false'], default: 'int')] +function xml_parse_into_struct(#[LanguageLevelTypeAware(["8.0" => "XMLParser"], default: "resource")] $parser, string $data, &$values, &$index) {} /** * Get XML parser error code @@ -521,13 +522,14 @@ function xml_parser_set_option(#[LanguageLevelTypeAware(["8.0" => "XMLParser"], * @param int $option Which option to fetch. XML_OPTION_CASE_FOLDING * and XML_OPTION_TARGET_ENCODING are available. * See xml_parser_set_option for their description. - * @return string|int This function returns FALSE if parser does + * @return string|int|bool This function returns FALSE if parser does * not refer to a valid parser or if option isn't * valid (generates also a E_WARNING). * Else the option's value is returned. */ #[Pure] -function xml_parser_get_option(#[LanguageLevelTypeAware(["8.0" => "XMLParser"], default: "resource")] $parser, int $option): string|int {} +#[LanguageLevelTypeAware(["8.3" => "string|int|bool"], default: "string|int")] +function xml_parser_get_option(#[LanguageLevelTypeAware(["8.0" => "XMLParser"], default: "resource")] $parser, int $option) {} define('XML_ERROR_NONE', 0); define('XML_ERROR_NO_MEMORY', 1);