Updated Rector to commit 21695e77a8906dbdce7ada865b140ccbf73dca56

21695e77a8 [Php80] Handle single quoted is_granted on AnnotationToAttributeRector (#2842)
This commit is contained in:
Tomas Votruba 2022-08-26 06:47:21 +00:00
parent dbe8618a4c
commit 6795a511a5
19 changed files with 135 additions and 77 deletions

View File

@ -6,6 +6,10 @@ namespace Rector\PhpAttribute\AnnotationToAttributeMapper;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\Array_;
use PhpParser\Node\Expr\ArrayItem;
use PhpParser\Node\Expr\ClassConstFetch;
use PhpParser\Node\Name;
use PhpParser\Node\Scalar\String_;
use Rector\Core\PhpParser\Node\Value\ValueResolver;
use Rector\PhpAttribute\AnnotationToAttributeMapper;
use Rector\PhpAttribute\Contract\AnnotationToAttributeMapperInterface;
use Rector\PhpAttribute\Enum\DocTagNodeState;
@ -20,6 +24,15 @@ final class ArrayAnnotationToAttributeMapper implements AnnotationToAttributeMap
* @var \Rector\PhpAttribute\AnnotationToAttributeMapper
*/
private $annotationToAttributeMapper;
/**
* @readonly
* @var \Rector\Core\PhpParser\Node\Value\ValueResolver
*/
private $valueResolver;
public function __construct(ValueResolver $valueResolver)
{
$this->valueResolver = $valueResolver;
}
/**
* Avoid circular reference
* @required
@ -52,7 +65,8 @@ final class ArrayAnnotationToAttributeMapper implements AnnotationToAttributeMap
continue;
}
if ($valueExpr instanceof ArrayItem) {
$arrayItems[] = $valueExpr;
$valueExpr = $this->resolveValueExprWithSingleQuoteHandling($valueExpr);
$arrayItems[] = $this->resolveValueExprWithSingleQuoteHandling($valueExpr);
} else {
$keyExpr = null;
if (!\is_int($key)) {
@ -64,6 +78,14 @@ final class ArrayAnnotationToAttributeMapper implements AnnotationToAttributeMap
}
return new Array_($arrayItems);
}
private function resolveValueExprWithSingleQuoteHandling(ArrayItem $arrayItem) : ArrayItem
{
if ($arrayItem->key === null && $arrayItem->value instanceof ClassConstFetch && $arrayItem->value->class instanceof Name && \strpos((string) $arrayItem->value->class, "'") !== \false) {
$arrayItem->value = new String_($this->valueResolver->getValue($arrayItem->value));
return $arrayItem;
}
return $arrayItem;
}
/**
* @param mixed $value
*/

View File

@ -17,12 +17,12 @@ final class VersionResolver
* @api
* @var string
*/
public const PACKAGE_VERSION = '7215c28735a3f1b3e56f86b5b57085ec3d8956c3';
public const PACKAGE_VERSION = '21695e77a8906dbdce7ada865b140ccbf73dca56';
/**
* @api
* @var string
*/
public const RELEASE_DATE = '2022-08-25 08:02:41';
public const RELEASE_DATE = '2022-08-26 08:42:30';
/**
* @var int
*/

2
vendor/autoload.php vendored
View File

@ -9,4 +9,4 @@ if (PHP_VERSION_ID < 50600) {
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInite174ad2947dde651e4bd1b958663937c::getLoader();
return ComposerAutoloaderInit247e8f9654d22e33915b5660b3fb3c6c::getLoader();

View File

@ -2,7 +2,7 @@
// autoload_real.php @generated by Composer
class ComposerAutoloaderInite174ad2947dde651e4bd1b958663937c
class ComposerAutoloaderInit247e8f9654d22e33915b5660b3fb3c6c
{
private static $loader;
@ -22,19 +22,19 @@ class ComposerAutoloaderInite174ad2947dde651e4bd1b958663937c
return self::$loader;
}
spl_autoload_register(array('ComposerAutoloaderInite174ad2947dde651e4bd1b958663937c', 'loadClassLoader'), true, true);
spl_autoload_register(array('ComposerAutoloaderInit247e8f9654d22e33915b5660b3fb3c6c', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
spl_autoload_unregister(array('ComposerAutoloaderInite174ad2947dde651e4bd1b958663937c', 'loadClassLoader'));
spl_autoload_unregister(array('ComposerAutoloaderInit247e8f9654d22e33915b5660b3fb3c6c', 'loadClassLoader'));
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInite174ad2947dde651e4bd1b958663937c::getInitializer($loader));
call_user_func(\Composer\Autoload\ComposerStaticInit247e8f9654d22e33915b5660b3fb3c6c::getInitializer($loader));
$loader->setClassMapAuthoritative(true);
$loader->register(true);
$includeFiles = \Composer\Autoload\ComposerStaticInite174ad2947dde651e4bd1b958663937c::$files;
$includeFiles = \Composer\Autoload\ComposerStaticInit247e8f9654d22e33915b5660b3fb3c6c::$files;
foreach ($includeFiles as $fileIdentifier => $file) {
composerRequiree174ad2947dde651e4bd1b958663937c($fileIdentifier, $file);
composerRequire247e8f9654d22e33915b5660b3fb3c6c($fileIdentifier, $file);
}
return $loader;
@ -46,7 +46,7 @@ class ComposerAutoloaderInite174ad2947dde651e4bd1b958663937c
* @param string $file
* @return void
*/
function composerRequiree174ad2947dde651e4bd1b958663937c($fileIdentifier, $file)
function composerRequire247e8f9654d22e33915b5660b3fb3c6c($fileIdentifier, $file)
{
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;

View File

@ -4,7 +4,7 @@
namespace Composer\Autoload;
class ComposerStaticInite174ad2947dde651e4bd1b958663937c
class ComposerStaticInit247e8f9654d22e33915b5660b3fb3c6c
{
public static $files = array (
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
@ -3256,9 +3256,9 @@ class ComposerStaticInite174ad2947dde651e4bd1b958663937c
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInite174ad2947dde651e4bd1b958663937c::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInite174ad2947dde651e4bd1b958663937c::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInite174ad2947dde651e4bd1b958663937c::$classMap;
$loader->prefixLengthsPsr4 = ComposerStaticInit247e8f9654d22e33915b5660b3fb3c6c::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit247e8f9654d22e33915b5660b3fb3c6c::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInit247e8f9654d22e33915b5660b3fb3c6c::$classMap;
}, null, ClassLoader::class);
}

View File

@ -1554,17 +1554,17 @@
},
{
"name": "react\/socket",
"version": "v1.11.0",
"version_normalized": "1.11.0.0",
"version": "v1.12.0",
"version_normalized": "1.12.0.0",
"source": {
"type": "git",
"url": "https:\/\/github.com\/reactphp\/socket.git",
"reference": "f474156aaab4f09041144fa8b57c7d70aed32a1c"
"reference": "81e1b4d7f5450ebd8d2e9a95bb008bb15ca95a7b"
},
"dist": {
"type": "zip",
"url": "https:\/\/api.github.com\/repos\/reactphp\/socket\/zipball\/f474156aaab4f09041144fa8b57c7d70aed32a1c",
"reference": "f474156aaab4f09041144fa8b57c7d70aed32a1c",
"url": "https:\/\/api.github.com\/repos\/reactphp\/socket\/zipball\/81e1b4d7f5450ebd8d2e9a95bb008bb15ca95a7b",
"reference": "81e1b4d7f5450ebd8d2e9a95bb008bb15ca95a7b",
"shasum": ""
},
"require": {
@ -1572,16 +1572,16 @@
"php": ">=5.3.0",
"react\/dns": "^1.8",
"react\/event-loop": "^1.2",
"react\/promise": "^2.6.0 || ^1.2.1",
"react\/promise-timer": "^1.8",
"react\/promise": "^3 || ^2.6 || ^1.2.1",
"react\/promise-timer": "^1.9",
"react\/stream": "^1.2"
},
"require-dev": {
"clue\/block-react": "^1.5",
"phpunit\/phpunit": "^9.3 || ^5.7 || ^4.8.35",
"react\/promise-stream": "^1.2"
"react\/async": "^4 || ^3 || ^2",
"react\/promise-stream": "^1.4"
},
"time": "2022-01-14T10:14:32+00:00",
"time": "2022-08-25T12:32:25+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@ -1625,7 +1625,7 @@
],
"support": {
"issues": "https:\/\/github.com\/reactphp\/socket\/issues",
"source": "https:\/\/github.com\/reactphp\/socket\/tree\/v1.11.0"
"source": "https:\/\/github.com\/reactphp\/socket\/tree\/v1.12.0"
},
"funding": [
{

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,28 @@
# Changelog
## 1.12.0 (2022-08-25)
* Feature: Forward compatibility with react/promise 3.
(#214 by @WyriHaximus and @clue)
* Feature: Full support for PHP 8.2 release.
(#298 by @WyriHaximus)
* Feature: Avoid unneeded syscall on socket close.
(#292 by @clue)
* Feature / Fix: Improve error reporting when custom error handler is used.
(#290 by @clue)
* Fix: Fix invalid references in exception stack trace.
(#284 by @clue)
* Minor documentation improvements, update to use new reactphp/async package instead of clue/reactphp-block.
(#296 by @clue, #285 by @SimonFrings and #295 by @nhedger)
* Improve test suite, update macOS and HHVM environment, fix optional tests for `ENETUNREACH`.
(#288, #289 and #297 by @clue)
## 1.11.0 (2022-01-14)
* Feature: Full support for PHP 8.1 release.

View File

@ -1,6 +1,7 @@
# Socket
[![CI status](https://github.com/reactphp/socket/workflows/CI/badge.svg)](https://github.com/reactphp/socket/actions)
[![installs on Packagist](https://img.shields.io/packagist/dt/react/socket?color=blue&label=installs%20on%20Packagist)](https://packagist.org/packages/react/socket)
Async, streaming plaintext TCP/IP and secure TLS socket server and client
connections for [ReactPHP](https://reactphp.org/).
@ -1493,7 +1494,7 @@ This project follows [SemVer](https://semver.org/).
This will install the latest supported version:
```bash
$ composer require react/socket:^1.11
composer require react/socket:^1.12
```
See also the [CHANGELOG](CHANGELOG.md) for details about version upgrades.
@ -1541,13 +1542,13 @@ To run the test suite, you first need to clone this repo and then install all
dependencies [through Composer](https://getcomposer.org/):
```bash
$ composer install
composer install
```
To run the test suite, go to the project root and run:
```bash
$ vendor/bin/phpunit
vendor/bin/phpunit
```
The test suite also contains a number of functional integration tests that rely
@ -1555,7 +1556,7 @@ on a stable internet connection.
If you do not want to run these, they can simply be skipped like this:
```bash
$ vendor/bin/phpunit --exclude-group internet
vendor/bin/phpunit --exclude-group internet
```
## License

View File

@ -36,14 +36,14 @@
"evenement\/evenement": "^3.0 || ^2.0 || ^1.0",
"react\/dns": "^1.8",
"react\/event-loop": "^1.2",
"react\/promise": "^2.6.0 || ^1.2.1",
"react\/promise-timer": "^1.8",
"react\/promise": "^3 || ^2.6 || ^1.2.1",
"react\/promise-timer": "^1.9",
"react\/stream": "^1.2"
},
"require-dev": {
"clue\/block-react": "^1.5",
"phpunit\/phpunit": "^9.3 || ^5.7 || ^4.8.35",
"react\/promise-stream": "^1.2"
"react\/async": "^4 || ^3 || ^2",
"react\/promise-stream": "^1.4"
},
"autoload": {
"psr-4": {

View File

@ -102,13 +102,9 @@ class Connection extends EventEmitter implements ConnectionInterface
return;
}
// Try to cleanly shut down socket and ignore any errors in case other
// side already closed. Shutting down may return to blocking mode on
// some legacy versions, so reset to non-blocking just in case before
// continuing to close the socket resource.
// Underlying Stream implementation will take care of closing file
// handle, so we otherwise keep this open here.
// side already closed. Underlying Stream implementation will take care
// of closing stream resource, so we otherwise keep this open here.
@\stream_socket_shutdown($this->stream, \STREAM_SHUT_RDWR);
\stream_set_blocking($this->stream, \false);
}
public function getRemoteAddress()
{

View File

@ -4,7 +4,7 @@ namespace RectorPrefix202208\React\Socket;
use RectorPrefix202208\React\Dns\Resolver\ResolverInterface;
use RectorPrefix202208\React\Promise;
use RectorPrefix202208\React\Promise\CancellablePromiseInterface;
use RectorPrefix202208\React\Promise\PromiseInterface;
final class DnsConnector implements ConnectorInterface
{
private $connector;
@ -52,11 +52,11 @@ final class DnsConnector implements ConnectorInterface
$trace = $r->getValue($e);
// Exception trace arguments are not available on some PHP 7.4 installs
// @codeCoverageIgnoreStart
foreach ($trace as &$one) {
foreach ($trace as $ti => $one) {
if (isset($one['args'])) {
foreach ($one['args'] as &$arg) {
foreach ($one['args'] as $ai => $arg) {
if ($arg instanceof \Closure) {
$arg = 'Object(' . \get_class($arg) . ')';
$trace[$ti]['args'][$ai] = 'Object(' . \get_class($arg) . ')';
}
}
}
@ -76,7 +76,7 @@ final class DnsConnector implements ConnectorInterface
$reject(new \RuntimeException('Connection to ' . $uri . ' cancelled during DNS lookup (ECONNABORTED)', \defined('SOCKET_ECONNABORTED') ? \SOCKET_ECONNABORTED : 103));
}
// (try to) cancel pending DNS lookup / connection attempt
if ($promise instanceof CancellablePromiseInterface) {
if ($promise instanceof PromiseInterface && \method_exists($promise, 'cancel')) {
// overwrite callback arguments for PHP7+ only, so they do not show
// up in the Exception trace and do not cause a possible cyclic reference.
$_ = $reject = null;

View File

@ -82,14 +82,18 @@ final class FdServer extends EventEmitter implements ServerInterface
throw new \InvalidArgumentException('Invalid FD number given (EINVAL)', \defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : 22);
}
$this->loop = $loop ?: Loop::get();
$this->master = @\fopen('php://fd/' . $fd, 'r+');
if (\false === $this->master) {
$errno = 0;
$errstr = '';
\set_error_handler(function ($_, $error) use(&$errno, &$errstr) {
// Match errstr from PHP's warning message.
// fopen(php://fd/3): Failed to open stream: Error duping file descriptor 3; possibly it doesn't exist: [9]: Bad file descriptor
$error = \error_get_last();
\preg_match('/\\[(\\d+)\\]: (.*)/', $error['message'], $m);
\preg_match('/\\[(\\d+)\\]: (.*)/', $error, $m);
$errno = isset($m[1]) ? (int) $m[1] : 0;
$errstr = isset($m[2]) ? $m[2] : $error['message'];
$errstr = isset($m[2]) ? $m[2] : $error;
});
$this->master = \fopen('php://fd/' . $fd, 'r+');
\restore_error_handler();
if (\false === $this->master) {
throw new \RuntimeException('Failed to listen on FD ' . $fd . ': ' . $errstr . SocketServer::errconst($errno), $errno);
}
$meta = \stream_get_meta_data($this->master);

View File

@ -7,7 +7,7 @@ use RectorPrefix202208\React\Dns\Resolver\ResolverInterface;
use RectorPrefix202208\React\EventLoop\LoopInterface;
use RectorPrefix202208\React\EventLoop\TimerInterface;
use RectorPrefix202208\React\Promise;
use RectorPrefix202208\React\Promise\CancellablePromiseInterface;
use RectorPrefix202208\React\Promise\PromiseInterface;
/**
* @internal
*/
@ -198,12 +198,12 @@ final class HappyEyeBallsConnectionBuilder
// clear list of outstanding IPs to avoid creating new connections
$this->connectQueue = array();
foreach ($this->connectionPromises as $connectionPromise) {
if ($connectionPromise instanceof CancellablePromiseInterface) {
if ($connectionPromise instanceof PromiseInterface && \method_exists($connectionPromise, 'cancel')) {
$connectionPromise->cancel();
}
}
foreach ($this->resolverPromises as $resolverPromise) {
if ($resolverPromise instanceof CancellablePromiseInterface) {
if ($resolverPromise instanceof PromiseInterface && \method_exists($resolverPromise, 'cancel')) {
$resolverPromise->cancel();
}
}

View File

@ -35,6 +35,7 @@ final class SecureConnector implements ConnectorInterface
$context = $this->context;
$encryption = $this->streamEncryption;
$connected = \false;
/** @var \React\Promise\PromiseInterface $promise */
$promise = $this->connector->connect(\str_replace('tls://', '', $uri))->then(function (ConnectionInterface $connection) use($context, $encryption, $uri, &$promise, &$connected) {
// (unencrypted) TCP/IP connection succeeded
$connected = \true;
@ -63,11 +64,11 @@ final class SecureConnector implements ConnectorInterface
$trace = $r->getValue($e);
// Exception trace arguments are not available on some PHP 7.4 installs
// @codeCoverageIgnoreStart
foreach ($trace as &$one) {
foreach ($trace as $ti => $one) {
if (isset($one['args'])) {
foreach ($one['args'] as &$arg) {
foreach ($one['args'] as $ai => $arg) {
if ($arg instanceof \Closure) {
$arg = 'Object(' . \get_class($arg) . ')';
$trace[$ti]['args'][$ai] = 'Object(' . \get_class($arg) . ')';
}
}
}

View File

@ -86,13 +86,17 @@ final class SocketServer extends EventEmitter implements ServerInterface
*/
public static function accept($socket)
{
$newSocket = @\stream_socket_accept($socket, 0);
if (\false === $newSocket) {
$errno = 0;
$errstr = '';
\set_error_handler(function ($_, $error) use(&$errno, &$errstr) {
// Match errstr from PHP's warning message.
// stream_socket_accept(): accept failed: Connection timed out
$error = \error_get_last();
$errstr = \preg_replace('#.*: #', '', $error['message']);
$errno = self::errno($errstr);
$errstr = \preg_replace('#.*: #', '', $error);
$errno = SocketServer::errno($errstr);
});
$newSocket = \stream_socket_accept($socket, 0);
\restore_error_handler();
if (\false === $newSocket) {
throw new \RuntimeException('Unable to accept new connection: ' . $errstr . self::errconst($errno), $errno);
}
return $newSocket;

View File

@ -94,7 +94,7 @@ class StreamEncryption
$result = \stream_socket_enable_crypto($socket, $toggle, $method);
\restore_error_handler();
if (\true === $result) {
$deferred->resolve();
$deferred->resolve(null);
} else {
if (\false === $result) {
// overwrite callback arguments for PHP7+ only, so they do not show

View File

@ -78,12 +78,17 @@ final class TcpConnector implements ConnectorInterface
// Linux reports socket errno and errstr again when trying to write to the dead socket.
// Suppress error reporting to get error message below and close dead socket before rejecting.
// This is only known to work on Linux, Mac and Windows are known to not support this.
@\fwrite($stream, \PHP_EOL);
$error = \error_get_last();
// fwrite(): send of 2 bytes failed with errno=111 Connection refused
\preg_match('/errno=(\\d+) (.+)/', $error['message'], $m);
$errno = isset($m[1]) ? (int) $m[1] : 0;
$errstr = isset($m[2]) ? $m[2] : $error['message'];
$errno = 0;
$errstr = '';
\set_error_handler(function ($_, $error) use(&$errno, &$errstr) {
// Match errstr from PHP's warning message.
// fwrite(): send of 1 bytes failed with errno=111 Connection refused
\preg_match('/errno=(\\d+) (.+)/', $error, $m);
$errno = isset($m[1]) ? (int) $m[1] : 0;
$errstr = isset($m[2]) ? $m[2] : $error;
});
\fwrite($stream, \PHP_EOL);
\restore_error_handler();
} else {
// Not on Linux and ext-sockets not available? Too bad.
$errno = \defined('SOCKET_ECONNREFUSED') ? \SOCKET_ECONNREFUSED : 111;

View File

@ -56,18 +56,20 @@ final class UnixServer extends EventEmitter implements ServerInterface
} elseif (\substr($path, 0, 7) !== 'unix://') {
throw new \InvalidArgumentException('Given URI "' . $path . '" is invalid (EINVAL)', \defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : 22);
}
$this->master = @\stream_socket_server($path, $errno, $errstr, \STREAM_SERVER_BIND | \STREAM_SERVER_LISTEN, \stream_context_create(array('socket' => $context)));
if (\false === $this->master) {
$errno = 0;
$errstr = '';
\set_error_handler(function ($_, $error) use(&$errno, &$errstr) {
// PHP does not seem to report errno/errstr for Unix domain sockets (UDS) right now.
// This only applies to UDS server sockets, see also https://3v4l.org/NAhpr.
// Parse PHP warning message containing unknown error, HHVM reports proper info at least.
if ($errno === 0 && $errstr === '') {
$error = \error_get_last();
if (\preg_match('/\\(([^\\)]+)\\)|\\[(\\d+)\\]: (.*)/', $error['message'], $match)) {
$errstr = isset($match[3]) ? $match['3'] : $match[1];
$errno = isset($match[2]) ? (int) $match[2] : 0;
}
if (\preg_match('/\\(([^\\)]+)\\)|\\[(\\d+)\\]: (.*)/', $error, $match)) {
$errstr = isset($match[3]) ? $match['3'] : $match[1];
$errno = isset($match[2]) ? (int) $match[2] : 0;
}
});
$this->master = \stream_socket_server($path, $errno, $errstr, \STREAM_SERVER_BIND | \STREAM_SERVER_LISTEN, \stream_context_create(array('socket' => $context)));
\restore_error_handler();
if (\false === $this->master) {
throw new \RuntimeException('Failed to listen on Unix domain socket "' . $path . '": ' . $errstr . SocketServer::errconst($errno), $errno);
}
\stream_set_blocking($this->master, 0);