summaryrefslogtreecommitdiff
path: root/vendor/doctrine
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2022-03-22 12:24:31 +0300
committerAndrew Dolgov <[email protected]>2022-03-22 12:24:31 +0300
commit1c4f7ab3b838b23afb2ee4dab14acbf75956e952 (patch)
tree0a19274107d717efe92d2c0376cd3105fead5a11 /vendor/doctrine
parent711662948768492e8d05b778a7d80eacaec368d2 (diff)
* add phpunit as a dev dependency
* add some basic tests for UrlHelper::rewrite_relative() * fix UrlHelper::rewrite_relative() to work better on non-absolute relative URL paths
Diffstat (limited to 'vendor/doctrine')
-rw-r--r--vendor/doctrine/instantiator/.doctrine-project.json47
-rw-r--r--vendor/doctrine/instantiator/CONTRIBUTING.md35
-rw-r--r--vendor/doctrine/instantiator/LICENSE19
-rw-r--r--vendor/doctrine/instantiator/README.md38
-rw-r--r--vendor/doctrine/instantiator/composer.json48
-rw-r--r--vendor/doctrine/instantiator/docs/en/index.rst68
-rw-r--r--vendor/doctrine/instantiator/docs/en/sidebar.rst4
-rw-r--r--vendor/doctrine/instantiator/psalm.xml16
-rw-r--r--vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php12
-rw-r--r--vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php50
-rw-r--r--vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php59
-rw-r--r--vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php260
-rw-r--r--vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php24
13 files changed, 680 insertions, 0 deletions
diff --git a/vendor/doctrine/instantiator/.doctrine-project.json b/vendor/doctrine/instantiator/.doctrine-project.json
new file mode 100644
index 000000000..24ae36e0d
--- /dev/null
+++ b/vendor/doctrine/instantiator/.doctrine-project.json
@@ -0,0 +1,47 @@
+{
+ "active": true,
+ "name": "Instantiator",
+ "slug": "instantiator",
+ "docsSlug": "doctrine-instantiator",
+ "codePath": "/src",
+ "versions": [
+ {
+ "name": "1.5",
+ "branchName": "1.5.x",
+ "slug": "latest",
+ "upcoming": true
+ },
+ {
+ "name": "1.4",
+ "branchName": "1.4.x",
+ "slug": "1.4",
+ "aliases": [
+ "current",
+ "stable"
+ ],
+ "maintained": true,
+ "current": true
+ },
+ {
+ "name": "1.3",
+ "branchName": "1.3.x",
+ "slug": "1.3",
+ "maintained": false
+ },
+ {
+ "name": "1.2",
+ "branchName": "1.2.x",
+ "slug": "1.2"
+ },
+ {
+ "name": "1.1",
+ "branchName": "1.1.x",
+ "slug": "1.1"
+ },
+ {
+ "name": "1.0",
+ "branchName": "1.0.x",
+ "slug": "1.0"
+ }
+ ]
+}
diff --git a/vendor/doctrine/instantiator/CONTRIBUTING.md b/vendor/doctrine/instantiator/CONTRIBUTING.md
new file mode 100644
index 000000000..c1a2c42ee
--- /dev/null
+++ b/vendor/doctrine/instantiator/CONTRIBUTING.md
@@ -0,0 +1,35 @@
+# Contributing
+
+ * Follow the [Doctrine Coding Standard](https://github.com/doctrine/coding-standard)
+ * The project will follow strict [object calisthenics](http://www.slideshare.net/guilhermeblanco/object-calisthenics-applied-to-php)
+ * Any contribution must provide tests for additional introduced conditions
+ * Any un-confirmed issue needs a failing test case before being accepted
+ * Pull requests must be sent from a new hotfix/feature branch, not from `master`.
+
+## Installation
+
+To install the project and run the tests, you need to clone it first:
+
+```sh
+$ git clone git://github.com/doctrine/instantiator.git
+```
+
+You will then need to run a composer installation:
+
+```sh
+$ cd Instantiator
+$ curl -s https://getcomposer.org/installer | php
+$ php composer.phar update
+```
+
+## Testing
+
+The PHPUnit version to be used is the one installed as a dev- dependency via composer:
+
+```sh
+$ ./vendor/bin/phpunit
+```
+
+Accepted coverage for new contributions is 80%. Any contribution not satisfying this requirement
+won't be merged.
+
diff --git a/vendor/doctrine/instantiator/LICENSE b/vendor/doctrine/instantiator/LICENSE
new file mode 100644
index 000000000..4d983d1ac
--- /dev/null
+++ b/vendor/doctrine/instantiator/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2014 Doctrine Project
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/doctrine/instantiator/README.md b/vendor/doctrine/instantiator/README.md
new file mode 100644
index 000000000..4bc02b655
--- /dev/null
+++ b/vendor/doctrine/instantiator/README.md
@@ -0,0 +1,38 @@
+# Instantiator
+
+This library provides a way of avoiding usage of constructors when instantiating PHP classes.
+
+[![Build Status](https://travis-ci.org/doctrine/instantiator.svg?branch=master)](https://travis-ci.org/doctrine/instantiator)
+[![Code Coverage](https://codecov.io/gh/doctrine/instantiator/branch/master/graph/badge.svg)](https://codecov.io/gh/doctrine/instantiator/branch/master)
+[![Dependency Status](https://www.versioneye.com/package/php--doctrine--instantiator/badge.svg)](https://www.versioneye.com/package/php--doctrine--instantiator)
+
+[![Latest Stable Version](https://poser.pugx.org/doctrine/instantiator/v/stable.png)](https://packagist.org/packages/doctrine/instantiator)
+[![Latest Unstable Version](https://poser.pugx.org/doctrine/instantiator/v/unstable.png)](https://packagist.org/packages/doctrine/instantiator)
+
+## Installation
+
+The suggested installation method is via [composer](https://getcomposer.org/):
+
+```sh
+php composer.phar require "doctrine/instantiator:~1.0.3"
+```
+
+## Usage
+
+The instantiator is able to create new instances of any class without using the constructor or any API of the class
+itself:
+
+```php
+$instantiator = new \Doctrine\Instantiator\Instantiator();
+
+$instance = $instantiator->instantiate(\My\ClassName\Here::class);
+```
+
+## Contributing
+
+Please read the [CONTRIBUTING.md](CONTRIBUTING.md) contents if you wish to help out!
+
+## Credits
+
+This library was migrated from [ocramius/instantiator](https://github.com/Ocramius/Instantiator), which
+has been donated to the doctrine organization, and which is now deprecated in favour of this package.
diff --git a/vendor/doctrine/instantiator/composer.json b/vendor/doctrine/instantiator/composer.json
new file mode 100644
index 000000000..4fba95ca6
--- /dev/null
+++ b/vendor/doctrine/instantiator/composer.json
@@ -0,0 +1,48 @@
+{
+ "name": "doctrine/instantiator",
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "type": "library",
+ "license": "MIT",
+ "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
+ "keywords": [
+ "instantiate",
+ "constructor"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "[email protected]",
+ "homepage": "https://ocramius.github.io/"
+ }
+ ],
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "ext-phar": "*",
+ "ext-pdo": "*",
+ "doctrine/coding-standard": "^9",
+ "phpbench/phpbench": "^0.16 || ^1",
+ "phpstan/phpstan": "^1.4",
+ "phpstan/phpstan-phpunit": "^1",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+ "vimeo/psalm": "^4.22"
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "autoload-dev": {
+ "psr-0": {
+ "DoctrineTest\\InstantiatorPerformance\\": "tests",
+ "DoctrineTest\\InstantiatorTest\\": "tests",
+ "DoctrineTest\\InstantiatorTestAsset\\": "tests"
+ }
+ },
+ "config": {
+ "allow-plugins": {
+ "dealerdirect/phpcodesniffer-composer-installer": true
+ }
+ }
+}
diff --git a/vendor/doctrine/instantiator/docs/en/index.rst b/vendor/doctrine/instantiator/docs/en/index.rst
new file mode 100644
index 000000000..0c85da0bc
--- /dev/null
+++ b/vendor/doctrine/instantiator/docs/en/index.rst
@@ -0,0 +1,68 @@
+Introduction
+============
+
+This library provides a way of avoiding usage of constructors when instantiating PHP classes.
+
+Installation
+============
+
+The suggested installation method is via `composer`_:
+
+.. code-block:: console
+
+ $ composer require doctrine/instantiator
+
+Usage
+=====
+
+The instantiator is able to create new instances of any class without
+using the constructor or any API of the class itself:
+
+.. code-block:: php
+
+ <?php
+
+ use Doctrine\Instantiator\Instantiator;
+ use App\Entities\User;
+
+ $instantiator = new Instantiator();
+
+ $user = $instantiator->instantiate(User::class);
+
+Contributing
+============
+
+- Follow the `Doctrine Coding Standard`_
+- The project will follow strict `object calisthenics`_
+- Any contribution must provide tests for additional introduced
+ conditions
+- Any un-confirmed issue needs a failing test case before being
+ accepted
+- Pull requests must be sent from a new hotfix/feature branch, not from
+ ``master``.
+
+Testing
+=======
+
+The PHPUnit version to be used is the one installed as a dev- dependency
+via composer:
+
+.. code-block:: console
+
+ $ ./vendor/bin/phpunit
+
+Accepted coverage for new contributions is 80%. Any contribution not
+satisfying this requirement won’t be merged.
+
+Credits
+=======
+
+This library was migrated from `ocramius/instantiator`_, which has been
+donated to the doctrine organization, and which is now deprecated in
+favour of this package.
+
+.. _composer: https://getcomposer.org/
+.. _CONTRIBUTING.md: CONTRIBUTING.md
+.. _ocramius/instantiator: https://github.com/Ocramius/Instantiator
+.. _Doctrine Coding Standard: https://github.com/doctrine/coding-standard
+.. _object calisthenics: http://www.slideshare.net/guilhermeblanco/object-calisthenics-applied-to-php
diff --git a/vendor/doctrine/instantiator/docs/en/sidebar.rst b/vendor/doctrine/instantiator/docs/en/sidebar.rst
new file mode 100644
index 000000000..0c3647914
--- /dev/null
+++ b/vendor/doctrine/instantiator/docs/en/sidebar.rst
@@ -0,0 +1,4 @@
+.. toctree::
+ :depth: 3
+
+ index
diff --git a/vendor/doctrine/instantiator/psalm.xml b/vendor/doctrine/instantiator/psalm.xml
new file mode 100644
index 000000000..e6270c138
--- /dev/null
+++ b/vendor/doctrine/instantiator/psalm.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<psalm
+ errorLevel="7"
+ phpVersion="8.1"
+ resolveFromConfigFile="true"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="https://getpsalm.org/schema/config"
+ xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
+>
+ <projectFiles>
+ <directory name="src" />
+ <ignoreFiles>
+ <directory name="vendor" />
+ </ignoreFiles>
+ </projectFiles>
+</psalm>
diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php
new file mode 100644
index 000000000..e6a5195f2
--- /dev/null
+++ b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php
@@ -0,0 +1,12 @@
+<?php
+
+namespace Doctrine\Instantiator\Exception;
+
+use Throwable;
+
+/**
+ * Base exception marker interface for the instantiator component
+ */
+interface ExceptionInterface extends Throwable
+{
+}
diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php
new file mode 100644
index 000000000..33de31c0b
--- /dev/null
+++ b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php
@@ -0,0 +1,50 @@
+<?php
+
+namespace Doctrine\Instantiator\Exception;
+
+use InvalidArgumentException as BaseInvalidArgumentException;
+use ReflectionClass;
+
+use function interface_exists;
+use function sprintf;
+use function trait_exists;
+
+/**
+ * Exception for invalid arguments provided to the instantiator
+ */
+class InvalidArgumentException extends BaseInvalidArgumentException implements ExceptionInterface
+{
+ public static function fromNonExistingClass(string $className): self
+ {
+ if (interface_exists($className)) {
+ return new self(sprintf('The provided type "%s" is an interface, and cannot be instantiated', $className));
+ }
+
+ if (trait_exists($className)) {
+ return new self(sprintf('The provided type "%s" is a trait, and cannot be instantiated', $className));
+ }
+
+ return new self(sprintf('The provided class "%s" does not exist', $className));
+ }
+
+ /**
+ * @phpstan-param ReflectionClass<T> $reflectionClass
+ *
+ * @template T of object
+ */
+ public static function fromAbstractClass(ReflectionClass $reflectionClass): self
+ {
+ return new self(sprintf(
+ 'The provided class "%s" is abstract, and cannot be instantiated',
+ $reflectionClass->getName()
+ ));
+ }
+
+ public static function fromEnum(string $className): self
+ {
+ return new self(sprintf(
+ 'The provided class "%s" is an enum, and cannot be instantiated',
+ $className
+ ));
+ }
+}
diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php
new file mode 100644
index 000000000..4e55ac525
--- /dev/null
+++ b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php
@@ -0,0 +1,59 @@
+<?php
+
+namespace Doctrine\Instantiator\Exception;
+
+use Exception;
+use ReflectionClass;
+use UnexpectedValueException as BaseUnexpectedValueException;
+
+use function sprintf;
+
+/**
+ * Exception for given parameters causing invalid/unexpected state on instantiation
+ */
+class UnexpectedValueException extends BaseUnexpectedValueException implements ExceptionInterface
+{
+ /**
+ * @phpstan-param ReflectionClass<T> $reflectionClass
+ *
+ * @template T of object
+ */
+ public static function fromSerializationTriggeredException(
+ ReflectionClass $reflectionClass,
+ Exception $exception
+ ): self {
+ return new self(
+ sprintf(
+ 'An exception was raised while trying to instantiate an instance of "%s" via un-serialization',
+ $reflectionClass->getName()
+ ),
+ 0,
+ $exception
+ );
+ }
+
+ /**
+ * @phpstan-param ReflectionClass<T> $reflectionClass
+ *
+ * @template T of object
+ */
+ public static function fromUncleanUnSerialization(
+ ReflectionClass $reflectionClass,
+ string $errorString,
+ int $errorCode,
+ string $errorFile,
+ int $errorLine
+ ): self {
+ return new self(
+ sprintf(
+ 'Could not produce an instance of "%s" via un-serialization, since an error was triggered '
+ . 'in file "%s" at line "%d"',
+ $reflectionClass->getName(),
+ $errorFile,
+ $errorLine
+ ),
+ 0,
+ new Exception($errorString, $errorCode)
+ );
+ }
+}
diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php
new file mode 100644
index 000000000..d616fa4db
--- /dev/null
+++ b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php
@@ -0,0 +1,260 @@
+<?php
+
+namespace Doctrine\Instantiator;
+
+use ArrayIterator;
+use Doctrine\Instantiator\Exception\ExceptionInterface;
+use Doctrine\Instantiator\Exception\InvalidArgumentException;
+use Doctrine\Instantiator\Exception\UnexpectedValueException;
+use Exception;
+use ReflectionClass;
+use ReflectionException;
+use Serializable;
+
+use function class_exists;
+use function enum_exists;
+use function is_subclass_of;
+use function restore_error_handler;
+use function set_error_handler;
+use function sprintf;
+use function strlen;
+use function unserialize;
+
+use const PHP_VERSION_ID;
+
+final class Instantiator implements InstantiatorInterface
+{
+ /**
+ * Markers used internally by PHP to define whether {@see \unserialize} should invoke
+ * the method {@see \Serializable::unserialize()} when dealing with classes implementing
+ * the {@see \Serializable} interface.
+ */
+ public const SERIALIZATION_FORMAT_USE_UNSERIALIZER = 'C';
+ public const SERIALIZATION_FORMAT_AVOID_UNSERIALIZER = 'O';
+
+ /**
+ * Used to instantiate specific classes, indexed by class name.
+ *
+ * @var callable[]
+ */
+ private static $cachedInstantiators = [];
+
+ /**
+ * Array of objects that can directly be cloned, indexed by class name.
+ *
+ * @var object[]
+ */
+ private static $cachedCloneables = [];
+
+ /**
+ * @param string $className
+ * @phpstan-param class-string<T> $className
+ *
+ * @return object
+ * @phpstan-return T
+ *
+ * @throws ExceptionInterface
+ *
+ * @template T of object
+ */
+ public function instantiate($className)
+ {
+ if (isset(self::$cachedCloneables[$className])) {
+ /**
+ * @phpstan-var T
+ */
+ $cachedCloneable = self::$cachedCloneables[$className];
+
+ return clone $cachedCloneable;
+ }
+
+ if (isset(self::$cachedInstantiators[$className])) {
+ $factory = self::$cachedInstantiators[$className];
+
+ return $factory();
+ }
+
+ return $this->buildAndCacheFromFactory($className);
+ }
+
+ /**
+ * Builds the requested object and caches it in static properties for performance
+ *
+ * @phpstan-param class-string<T> $className
+ *
+ * @return object
+ * @phpstan-return T
+ *
+ * @template T of object
+ */
+ private function buildAndCacheFromFactory(string $className)
+ {
+ $factory = self::$cachedInstantiators[$className] = $this->buildFactory($className);
+ $instance = $factory();
+
+ if ($this->isSafeToClone(new ReflectionClass($instance))) {
+ self::$cachedCloneables[$className] = clone $instance;
+ }
+
+ return $instance;
+ }
+
+ /**
+ * Builds a callable capable of instantiating the given $className without
+ * invoking its constructor.
+ *
+ * @phpstan-param class-string<T> $className
+ *
+ * @phpstan-return callable(): T
+ *
+ * @throws InvalidArgumentException
+ * @throws UnexpectedValueException
+ * @throws ReflectionException
+ *
+ * @template T of object
+ */
+ private function buildFactory(string $className): callable
+ {
+ $reflectionClass = $this->getReflectionClass($className);
+
+ if ($this->isInstantiableViaReflection($reflectionClass)) {
+ return [$reflectionClass, 'newInstanceWithoutConstructor'];
+ }
+
+ $serializedString = sprintf(
+ '%s:%d:"%s":0:{}',
+ is_subclass_of($className, Serializable::class) ? self::SERIALIZATION_FORMAT_USE_UNSERIALIZER : self::SERIALIZATION_FORMAT_AVOID_UNSERIALIZER,
+ strlen($className),
+ $className
+ );
+
+ $this->checkIfUnSerializationIsSupported($reflectionClass, $serializedString);
+
+ return static function () use ($serializedString) {
+ return unserialize($serializedString);
+ };
+ }
+
+ /**
+ * @phpstan-param class-string<T> $className
+ *
+ * @phpstan-return ReflectionClass<T>
+ *
+ * @throws InvalidArgumentException
+ * @throws ReflectionException
+ *
+ * @template T of object
+ */
+ private function getReflectionClass(string $className): ReflectionClass
+ {
+ if (! class_exists($className)) {
+ throw InvalidArgumentException::fromNonExistingClass($className);
+ }
+
+ if (PHP_VERSION_ID >= 80100 && enum_exists($className, false)) {
+ throw InvalidArgumentException::fromEnum($className);
+ }
+
+ $reflection = new ReflectionClass($className);
+
+ if ($reflection->isAbstract()) {
+ throw InvalidArgumentException::fromAbstractClass($reflection);
+ }
+
+ return $reflection;
+ }
+
+ /**
+ * @phpstan-param ReflectionClass<T> $reflectionClass
+ *
+ * @throws UnexpectedValueException
+ *
+ * @template T of object
+ */
+ private function checkIfUnSerializationIsSupported(ReflectionClass $reflectionClass, string $serializedString): void
+ {
+ set_error_handler(static function (int $code, string $message, string $file, int $line) use ($reflectionClass, &$error): bool {
+ $error = UnexpectedValueException::fromUncleanUnSerialization(
+ $reflectionClass,
+ $message,
+ $code,
+ $file,
+ $line
+ );
+
+ return true;
+ });
+
+ try {
+ $this->attemptInstantiationViaUnSerialization($reflectionClass, $serializedString);
+ } finally {
+ restore_error_handler();
+ }
+
+ if ($error) {
+ throw $error;
+ }
+ }
+
+ /**
+ * @phpstan-param ReflectionClass<T> $reflectionClass
+ *
+ * @throws UnexpectedValueException
+ *
+ * @template T of object
+ */
+ private function attemptInstantiationViaUnSerialization(ReflectionClass $reflectionClass, string $serializedString): void
+ {
+ try {
+ unserialize($serializedString);
+ } catch (Exception $exception) {
+ throw UnexpectedValueException::fromSerializationTriggeredException($reflectionClass, $exception);
+ }
+ }
+
+ /**
+ * @phpstan-param ReflectionClass<T> $reflectionClass
+ *
+ * @template T of object
+ */
+ private function isInstantiableViaReflection(ReflectionClass $reflectionClass): bool
+ {
+ return ! ($this->hasInternalAncestors($reflectionClass) && $reflectionClass->isFinal());
+ }
+
+ /**
+ * Verifies whether the given class is to be considered internal
+ *
+ * @phpstan-param ReflectionClass<T> $reflectionClass
+ *
+ * @template T of object
+ */
+ private function hasInternalAncestors(ReflectionClass $reflectionClass): bool
+ {
+ do {
+ if ($reflectionClass->isInternal()) {
+ return true;
+ }
+
+ $reflectionClass = $reflectionClass->getParentClass();
+ } while ($reflectionClass);
+
+ return false;
+ }
+
+ /**
+ * Checks if a class is cloneable
+ *
+ * Classes implementing `__clone` cannot be safely cloned, as that may cause side-effects.
+ *
+ * @phpstan-param ReflectionClass<T> $reflectionClass
+ *
+ * @template T of object
+ */
+ private function isSafeToClone(ReflectionClass $reflectionClass): bool
+ {
+ return $reflectionClass->isCloneable()
+ && ! $reflectionClass->hasMethod('__clone')
+ && ! $reflectionClass->isSubclassOf(ArrayIterator::class);
+ }
+}
diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php
new file mode 100644
index 000000000..10508b562
--- /dev/null
+++ b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Doctrine\Instantiator;
+
+use Doctrine\Instantiator\Exception\ExceptionInterface;
+
+/**
+ * Instantiator provides utility methods to build objects without invoking their constructors
+ */
+interface InstantiatorInterface
+{
+ /**
+ * @param string $className
+ * @phpstan-param class-string<T> $className
+ *
+ * @return object
+ * @phpstan-return T
+ *
+ * @throws ExceptionInterface
+ *
+ * @template T of object
+ */
+ public function instantiate($className);
+}