.doctrine-project.json000064400000001431144760112770011000 0ustar00{ "active": true, "name": "Reflection", "slug": "reflection", "docsSlug": "doctrine-reflection", "versions": [ { "name": "1.3", "branchName": "master", "slug": "latest", "upcoming": true }, { "name": "1.2", "branchName": "1.2.x", "slug": "1.2", "current": true, "aliases": [ "current", "stable" ] }, { "name": "1.1", "branchName": "1.1.x", "slug": "1.1", "maintained": false }, { "name": "1.0", "branchName": "1.0", "slug": "1.0", "maintained": false } ] } .github/workflows/coding-standards.yml000064400000002261144760112770014122 0ustar00 name: "Coding Standards" on: pull_request: branches: - "*.x" - "master" push: branches: - "*.x" - "master" env: COMPOSER_ROOT_VERSION: "1.2" jobs: coding-standards: name: "Coding Standards" runs-on: "ubuntu-20.04" strategy: matrix: php-version: - "7.4" steps: - name: "Checkout" uses: "actions/checkout@v2" - name: "Install PHP" uses: "shivammathur/setup-php@v2" with: coverage: "none" php-version: "${{ matrix.php-version }}" tools: "cs2pr" - name: "Cache dependencies installed with Composer" uses: "actions/cache@v2" with: path: "~/.composer/cache" key: "php-${{ matrix.php-version }}-composer-locked-${{ hashFiles('composer.lock') }}" restore-keys: "php-${{ matrix.php-version }}-composer-locked-" - name: "Install dependencies with Composer" run: "composer install --no-interaction --no-progress --no-suggest" # https://github.com/doctrine/.github/issues/3 - name: "Run PHP_CodeSniffer" run: "vendor/bin/phpcs -q --no-colors --report=checkstyle | cs2pr" .github/workflows/release-on-milestone-closed.yml000064400000002747144760112770016205 0ustar00name: "Automatic Releases" on: milestone: types: - "closed" jobs: release: name: "Git tag, release & create merge-up PR" runs-on: "ubuntu-20.04" steps: - name: "Checkout" uses: "actions/checkout@v2" - name: "Release" uses: "laminas/automatic-releases@v1" with: command-name: "laminas:automatic-releases:release" env: "GITHUB_TOKEN": ${{ secrets.GITHUB_TOKEN }} "SIGNING_SECRET_KEY": ${{ secrets.SIGNING_SECRET_KEY }} "GIT_AUTHOR_NAME": ${{ secrets.GIT_AUTHOR_NAME }} "GIT_AUTHOR_EMAIL": ${{ secrets.GIT_AUTHOR_EMAIL }} - name: "Create Merge-Up Pull Request" uses: "laminas/automatic-releases@v1" with: command-name: "laminas:automatic-releases:create-merge-up-pull-request" env: "GITHUB_TOKEN": ${{ secrets.GITHUB_TOKEN }} "SIGNING_SECRET_KEY": ${{ secrets.SIGNING_SECRET_KEY }} "GIT_AUTHOR_NAME": ${{ secrets.GIT_AUTHOR_NAME }} "GIT_AUTHOR_EMAIL": ${{ secrets.GIT_AUTHOR_EMAIL }} - name: "Create new milestones" uses: "laminas/automatic-releases@v1" with: command-name: "laminas:automatic-releases:create-milestones" env: "GITHUB_TOKEN": ${{ secrets.GITHUB_TOKEN }} "SIGNING_SECRET_KEY": ${{ secrets.SIGNING_SECRET_KEY }} "GIT_AUTHOR_NAME": ${{ secrets.GIT_AUTHOR_NAME }} "GIT_AUTHOR_EMAIL": ${{ secrets.GIT_AUTHOR_EMAIL }} LICENSE000064400000002051144760112770005560 0ustar00Copyright (c) 2006-2015 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. README.md000064400000001427144760112770006040 0ustar00# Doctrine Reflection [![Build Status](https://travis-ci.org/doctrine/reflection.svg)](https://travis-ci.org/doctrine/reflection) [![Code Coverage](https://codecov.io/gh/doctrine/dbal/branch/reflection/graph/badge.svg)](https://codecov.io/gh/doctrine/reflection/branch/master) The Doctrine Reflection project is a simple library used by the various Doctrine projects which adds some additional functionality on top of the reflection functionality that comes with PHP. It allows you to get the reflection information about classes, methods and properties statically. ## More resources: * [Website](https://www.doctrine-project.org/) * [Documentation](https://www.doctrine-project.org/projects/doctrine-reflection/en/latest/) * [Downloads](https://github.com/doctrine/reflection/releases) composer.json000064400000003520144760112770007277 0ustar00{ "name": "doctrine/reflection", "type": "library", "description": "The Doctrine Reflection project is a simple library used by the various Doctrine projects which adds some additional functionality on top of the reflection functionality that comes with PHP. It allows you to get the reflection information about classes, methods and properties statically.", "keywords": [ "reflection", "static" ], "homepage": "https://www.doctrine-project.org/projects/reflection.html", "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"}, {"name": "Marco Pivetta", "email": "ocramius@gmail.com"} ], "require": { "php": "^7.1 || ^8.0", "ext-tokenizer": "*", "doctrine/annotations": "^1.0" }, "require-dev": { "doctrine/coding-standard": "^6.0 || ^8.2.0", "doctrine/common": "^2.10", "phpstan/phpstan": "^0.11.0 || ^0.12.20", "phpstan/phpstan-phpunit": "^0.11.0 || ^0.12.16", "phpunit/phpunit": "^7.5 || ^9.1.5" }, "conflict": { "doctrine/common": "<2.9" }, "autoload": { "psr-4": { "Doctrine\\Common\\": "lib/Doctrine/Common" } }, "autoload-dev": { "psr-4": { "Doctrine\\Tests\\": "tests/Doctrine/Tests", "Doctrine\\Tests_PHP74\\": "tests/Doctrine/Tests_PHP74" } }, "config": { "sort-packages": true }, "extra": { "branch-alias": { "dev-master": "1.2.x-dev" } } } lib/Doctrine/Common/Reflection/ClassFinderInterface.php000064400000000524144760112770017144 0ustar00= 80000) { class_alias('Doctrine\Common\Reflection\Compatibility\Php8\ReflectionClass', 'Doctrine\Common\Reflection\Compatibility\ReflectionClass'); } else { class_alias('Doctrine\Common\Reflection\Compatibility\Php7\ReflectionClass', 'Doctrine\Common\Reflection\Compatibility\ReflectionClass'); } if (false) { class ReflectionClass { } } lib/Doctrine/Common/Reflection/Compatibility/ReflectionMethod.php000064400000000762144760112770021176 0ustar00= 80000) { class_alias('Doctrine\Common\Reflection\Compatibility\Php8\ReflectionMethod', 'Doctrine\Common\Reflection\Compatibility\ReflectionMethod'); } else { class_alias('Doctrine\Common\Reflection\Compatibility\Php7\ReflectionMethod', 'Doctrine\Common\Reflection\Compatibility\ReflectionMethod'); } if (false) { class ReflectionMethod { } } lib/Doctrine/Common/Reflection/Psr0FindFile.php000064400000003267144760112770015362 0ustar00prefixes = $prefixes; } /** * {@inheritDoc} */ public function findFile($class) { if ($class[0] === '\\') { $class = substr($class, 1); } $lastNsPos = strrpos($class, '\\'); if ($lastNsPos !== false) { // namespaced class name $classPath = str_replace('\\', DIRECTORY_SEPARATOR, substr($class, 0, $lastNsPos)) . DIRECTORY_SEPARATOR; $className = substr($class, $lastNsPos + 1); } else { // PEAR-like class name $classPath = null; $className = $class; } $classPath .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php'; foreach ($this->prefixes as $prefix => $dirs) { if (strpos($class, $prefix) !== 0) { continue; } foreach ($dirs as $dir) { if (is_file($dir . DIRECTORY_SEPARATOR . $classPath)) { return $dir . DIRECTORY_SEPARATOR . $classPath; } } } return null; } } lib/Doctrine/Common/Reflection/ReflectionProviderInterface.php000064400000001311144760112770020547 0ustar00getName(); if ($object instanceof Proxy && ! $object->__isInitialized()) { $originalInitializer = $object->__getInitializer(); $object->__setInitializer(null); $val = $object->$name ?? null; $object->__setInitializer($originalInitializer); return $val; } return isset($object->$name) ? parent::getValue($object) : null; } /** * {@inheritDoc} * * Avoids triggering lazy loading via `__set` if the provided object * is a {@see \Doctrine\Common\Proxy\Proxy}. * * @link https://bugs.php.net/bug.php?id=63463 */ public function setValue($object, $value = null) { if (! ($object instanceof Proxy && ! $object->__isInitialized())) { parent::setValue($object, $value); return; } $originalInitializer = $object->__getInitializer(); $object->__setInitializer(null); parent::setValue($object, $value); $object->__setInitializer($originalInitializer); } } lib/Doctrine/Common/Reflection/StaticReflectionClass.php000064400000017260144760112770017363 0ustar00staticReflectionParser = $staticReflectionParser; } /** * {@inheritDoc} */ public function getName() { return $this->staticReflectionParser->getClassName(); } /** * {@inheritDoc} */ public function getDocComment() { return $this->staticReflectionParser->getDocComment(); } /** * {@inheritDoc} */ public function getNamespaceName() { return $this->staticReflectionParser->getNamespaceName(); } /** * @return string[] */ public function getUseStatements() { return $this->staticReflectionParser->getUseStatements(); } /** * {@inheritDoc} */ public function getMethod($name) { return $this->staticReflectionParser->getReflectionMethod($name); } /** * {@inheritDoc} */ public function getProperty($name) { return $this->staticReflectionParser->getReflectionProperty($name); } /** * {@inheritDoc} */ public static function export($argument, $return = false) { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getConstant($name) { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getConstructor() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getDefaultProperties() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getEndLine() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getExtension() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getExtensionName() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getFileName() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getInterfaceNames() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getInterfaces() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getMethods($filter = null) { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getModifiers() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getParentClass() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getProperties($filter = null) { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getShortName() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getStartLine() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getStaticProperties() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getStaticPropertyValue($name, $default = '') { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getTraitAliases() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getTraitNames() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getTraits() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function hasConstant($name) { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function hasMethod($name) { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function hasProperty($name) { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function implementsInterface($interface) { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function inNamespace() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function isAbstract() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function isCloneable() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function isFinal() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function isInstance($object) { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function isInstantiable() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function isInterface() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function isInternal() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function isIterateable() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function isSubclassOf($class) { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function isTrait() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function isUserDefined() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function newInstanceArgs(array $args = []) { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function newInstanceWithoutConstructor() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function setStaticPropertyValue($name, $value) { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function __toString() { throw new ReflectionException('Method not implemented'); } } lib/Doctrine/Common/Reflection/StaticReflectionMethod.php000064400000015051144760112770017532 0ustar00staticReflectionParser = $staticReflectionParser; $this->methodName = $methodName; } /** * {@inheritDoc} */ public function getName() { return $this->methodName; } /** * @return StaticReflectionParser */ protected function getStaticReflectionParser() { return $this->staticReflectionParser->getStaticReflectionParserForDeclaringClass('method', $this->methodName); } /** * {@inheritDoc} */ public function getDeclaringClass() { return $this->getStaticReflectionParser()->getReflectionClass(); } /** * {@inheritDoc} */ public function getNamespaceName() { return $this->getStaticReflectionParser()->getNamespaceName(); } /** * {@inheritDoc} */ public function getDocComment() { return $this->getStaticReflectionParser()->getDocComment('method', $this->methodName); } /** * @return string[] */ public function getUseStatements() { return $this->getStaticReflectionParser()->getUseStatements(); } /** * {@inheritDoc} */ public static function export($class, $name, $return = false) { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getClosure($object = null) { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getModifiers() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getPrototype() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function invokeArgs($object, array $args) { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function isAbstract() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function isConstructor() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function isDestructor() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function isFinal() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function isPrivate() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function isProtected() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function isPublic() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function isStatic() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function setAccessible($accessible) { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function __toString() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getClosureThis() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getEndLine() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getExtension() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getExtensionName() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getFileName() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getNumberOfParameters() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getNumberOfRequiredParameters() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getParameters() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getShortName() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getStartLine() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getStaticVariables() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function inNamespace() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function isClosure() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function isDeprecated() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function isInternal() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function isUserDefined() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function returnsReference() { throw new ReflectionException('Method not implemented'); } } lib/Doctrine/Common/Reflection/StaticReflectionParser.php000064400000023124144760112770017546 0ustar00 '', 'property' => [], 'method' => [], ]; /** * The name of the class this class extends, if any. * * @var string */ protected $parentClassName = ''; /** * The parent PSR-0 Parser. * * @var \Doctrine\Common\Reflection\StaticReflectionParser */ protected $parentStaticReflectionParser; /** * Parses a class residing in a PSR-0 hierarchy. * * @param string $className The full, namespaced class name. * @param ClassFinderInterface $finder A ClassFinder object which finds the class. * @param bool $classAnnotationOptimize Only retrieve the class docComment. * Presumes there is only one statement per line. */ public function __construct($className, $finder, $classAnnotationOptimize = false) { $this->className = ltrim($className, '\\'); $lastNsPos = strrpos($this->className, '\\'); if ($lastNsPos !== false) { $this->namespace = substr($this->className, 0, $lastNsPos); $this->shortClassName = substr($this->className, $lastNsPos + 1); } else { $this->shortClassName = $this->className; } $this->finder = $finder; $this->classAnnotationOptimize = $classAnnotationOptimize; } /** * @return void */ protected function parse() { $fileName = $this->finder->findFile($this->className); if ($this->parsed || ! $fileName) { return; } $this->parsed = true; $contents = file_get_contents($fileName); if ($this->classAnnotationOptimize) { $regex = sprintf('/\A.*^\s*((abstract|final)\s+)?class\s+%s\s+/sm', $this->shortClassName); if (preg_match($regex, $contents, $matches)) { $contents = $matches[0]; } } $tokenParser = new TokenParser($contents); $docComment = ''; $last_token = false; while ($token = $tokenParser->next(false)) { switch ($token[0]) { case T_USE: $this->useStatements = array_merge($this->useStatements, $tokenParser->parseUseStatement()); break; case T_DOC_COMMENT: $docComment = $token[1]; break; case T_CLASS: if ($last_token !== T_PAAMAYIM_NEKUDOTAYIM && $last_token !== T_NEW) { $this->docComment['class'] = $docComment; $docComment = ''; } break; case T_VAR: case T_PRIVATE: case T_PROTECTED: case T_PUBLIC: $token = $tokenParser->next(); if ($token[0] === T_VARIABLE) { $propertyName = substr($token[1], 1); $this->docComment['property'][$propertyName] = $docComment; continue 2; } if ($token[0] !== T_FUNCTION) { // For example, it can be T_FINAL. continue 2; } // No break. case T_FUNCTION: // The next string after function is the name, but // there can be & before the function name so find the // string. while (($token = $tokenParser->next()) && $token[0] !== T_STRING) { continue; } if ($token === null) { break; } $methodName = $token[1]; $this->docComment['method'][$methodName] = $docComment; $docComment = ''; break; case T_EXTENDS: $this->parentClassName = $tokenParser->parseClass(); $nsPos = strpos($this->parentClassName, '\\'); $fullySpecified = false; if ($nsPos === 0) { $fullySpecified = true; } else { if ($nsPos) { $prefix = strtolower(substr($this->parentClassName, 0, $nsPos)); $postfix = substr($this->parentClassName, $nsPos); } else { $prefix = strtolower($this->parentClassName); $postfix = ''; } foreach ($this->useStatements as $alias => $use) { if ($alias !== $prefix) { continue; } $this->parentClassName = '\\' . $use . $postfix; $fullySpecified = true; } } if (! $fullySpecified) { $this->parentClassName = '\\' . $this->namespace . '\\' . $this->parentClassName; } break; } $last_token = is_array($token) ? $token[0] : false; } } /** * @return StaticReflectionParser */ protected function getParentStaticReflectionParser() { if (empty($this->parentStaticReflectionParser)) { $this->parentStaticReflectionParser = new static($this->parentClassName, $this->finder); } return $this->parentStaticReflectionParser; } /** * @return string */ public function getClassName() { return $this->className; } /** * @return string */ public function getNamespaceName() { return $this->namespace; } /** * {@inheritDoc} */ public function getReflectionClass() { return new StaticReflectionClass($this); } /** * {@inheritDoc} */ public function getReflectionMethod($methodName) { return new StaticReflectionMethod($this, $methodName); } /** * {@inheritDoc} */ public function getReflectionProperty($propertyName) { return new StaticReflectionProperty($this, $propertyName); } /** * Gets the use statements from this file. * * @return string[] */ public function getUseStatements() { $this->parse(); return $this->useStatements; } /** * Gets the doc comment. * * @param string $type The type: 'class', 'property' or 'method'. * @param string $name The name of the property or method, not needed for 'class'. * * @return string The doc comment, empty string if none. */ public function getDocComment($type = 'class', $name = '') { $this->parse(); return $name ? $this->docComment[$type][$name] : $this->docComment[$type]; } /** * Gets the PSR-0 parser for the declaring class. * * @param string $type The type: 'property' or 'method'. * @param string $name The name of the property or method. * * @return StaticReflectionParser A static reflection parser for the declaring class. * * @throws ReflectionException */ public function getStaticReflectionParserForDeclaringClass($type, $name) { $this->parse(); if (isset($this->docComment[$type][$name])) { return $this; } if (! empty($this->parentClassName)) { return $this->getParentStaticReflectionParser()->getStaticReflectionParserForDeclaringClass($type, $name); } throw new ReflectionException('Invalid ' . $type . ' "' . $name . '"'); } } lib/Doctrine/Common/Reflection/StaticReflectionProperty.php000064400000006265144760112770020145 0ustar00staticReflectionParser = $staticReflectionParser; $this->propertyName = $propertyName; } /** * {@inheritDoc} */ public function getName() { return $this->propertyName; } /** * @return StaticReflectionParser */ protected function getStaticReflectionParser() { return $this->staticReflectionParser->getStaticReflectionParserForDeclaringClass('property', $this->propertyName); } /** * {@inheritDoc} */ public function getDeclaringClass() { return $this->getStaticReflectionParser()->getReflectionClass(); } /** * {@inheritDoc} */ public function getDocComment() { return $this->getStaticReflectionParser()->getDocComment('property', $this->propertyName); } /** * @return string[] */ public function getUseStatements() { return $this->getStaticReflectionParser()->getUseStatements(); } /** * {@inheritDoc} */ public static function export($class, $name, $return = false) { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getModifiers() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function getValue($object = null) { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function isDefault() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function isPrivate() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function isProtected() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function isPublic() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function isStatic() { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function setAccessible($accessible) { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function setValue($object, $value = null) { throw new ReflectionException('Method not implemented'); } /** * {@inheritDoc} */ public function __toString() { throw new ReflectionException('Method not implemented'); } } lib/Doctrine/Common/Reflection/TypedNoDefaultReflectionProperty.php000064400000002731144760112770021577 0ustar00isInitialized($object) ? parent::getValue($object) : null; } /** * {@inheritDoc} * * Works around the problem with setting typed no default properties to * NULL which is not supported, instead unset() to uninitialize. * * @link https://github.com/doctrine/orm/issues/7999 */ public function setValue($object, $value = null) { if ($value === null && $this->hasType() && ! $this->getType()->allowsNull()) { $propertyName = $this->getName(); $unsetter = function () use ($propertyName) { unset($this->$propertyName); }; $unsetter = $unsetter->bindTo($object, $this->getDeclaringClass()->getName()); $unsetter(); return; } parent::setValue($object, $value); } } phpstan.neon.dist000064400000001000144760112770010044 0ustar00parameters: level: 3 paths: - %rootDir%/../../../lib - %rootDir%/../../../tests ignoreErrors: - '#Doctrine\\Common\\Reflection\\StaticReflection[a-zA-Z0-9_]+::__construct\(\) does not call parent constructor from Reflection[a-zA-Z0-9_]+#' excludes_analyse: - lib/Doctrine/Common/Reflection/Compatibility/ReflectionClass.php - lib/Doctrine/Common/Reflection/Compatibility/ReflectionMethod.php includes: - vendor/phpstan/phpstan-phpunit/extension.neon