36 Commits

Author SHA1 Message Date
Grégoire Paris fa587178be Merge pull request #49 from alexpott/php8-compatibility
PHP 8 compatibility
2020-10-27 22:46:55 +01:00
Alex Pott dc269e064a doctrine/coding-standard needs a PHP 8.0 compatible version 2020-10-27 21:35:12 +00:00
Alex Pott a8d82251c6 Fix up things after merging 1.2.x 2020-10-27 21:27:25 +00:00
Alex Pott f3ade869eb Ensure phpstan runs with locked dependencies 2020-10-27 22:05:39 +01:00
Alex Pott 06eec07aa3 Ignore compatibility files in phpstan 2020-10-27 22:05:39 +01:00
Alex Pott 2336d15b1a Update dist to use a more recent PHP 8.0 2020-10-27 22:04:16 +01:00
Alex Pott a82bebf801 Initial commit 2020-10-27 22:04:16 +01:00
Grégoire Paris e65c2eb6a8 Merge pull request #51 from doctrine/greg0ire-patch-1
Setup release workflow
2020-10-27 22:01:47 +01:00
Grégoire Paris e3c48f5fbd Merge pull request #50 from greg0ire/migrate-cs-to-ga
Migrate cs to ga
2020-10-27 21:55:50 +01:00
Grégoire Paris cac3bcb8fc Migrate to Github Actions for coding standard 2020-10-27 21:47:11 +01:00
Grégoire Paris db4b566464 Setup release workflow 2020-10-27 21:45:16 +01:00
Grégoire Paris 486d0cbea5 Upgrade doctrine/coding-standard
It depends on a library that needs to be upgraded so that we can use
Composer 2
2020-10-27 21:40:39 +01:00
Claudio Zizza cea2760c34 Merge pull request #48 from doctrine/default-branch-website-config
Move website config to default branch
2020-10-05 14:03:36 +02:00
Claudio Zizza 4f143d5384 Move website config to default branch
Adapts the website config to be compatible with the doctrine/doctrine-website#356 changes
2020-10-03 20:14:44 +02:00
Grégoire Paris efdbb0f82a Merge pull request #44 from greg0ire/scrutinizer➡codecov
Use CodeCov instead of Scrutinizer
2020-06-20 15:00:11 +02:00
Grégoire Paris edfb312da0 Use CodeCov instead of Scrutinizer 2020-06-20 14:12:43 +02:00
Grégoire Paris 344bc74ba8 Merge remote-tracking branch 'origin/1.1.x' into 1.2.x 2020-05-27 18:45:57 +02:00
Grégoire Paris 1b33070b49 Merge pull request #33 from DieterHolvoet/issue-32
Fix Trying to access array offset on value of type null
2020-04-26 13:02:52 +02:00
Dieter Holvoet 41a2f0f445 Add type check to prevent PHP 7.4 warnings
PHP 7.4 introduces a "Trying to access array offset on value of type ..." warning for accessing null/bool/int/float/resource (everything but array, string and object) as if it were an array. This commit fixes an instance where this warning is emitted.

Fixes #32.
2020-04-26 12:57:05 +02:00
Grégoire Paris d11bac73db Merge pull request #40 from pgrimaud/master
Fix typo in lib/Doctrine/Common/Reflection/TypedNoDefaultReflectionProperty.php
2020-04-18 23:41:10 +02:00
Pierre Grimaud 1c7272c98a Fix typos 2020-04-18 23:34:26 +02:00
Grégoire Paris 8f7fdc01b3 Merge pull request #38 from greg0ire/validate-composer-json
Validate composer json
2020-03-30 18:19:46 +02:00
Benjamin Eberlei 55e71912df Merge pull request #37 from doctrine/GH-36-BugfixTypedNullable
[GH-36] Bugfix: TypedNoDefaultReflectionProperty::setValue NULL when null allowed
2020-03-27 12:06:43 +01:00
Benjamin Eberlei fbc77cc1c8 [GH-36] Be on the safe side and check property has a type. 2020-03-25 10:09:58 +01:00
Grégoire Paris 79de2517ba Sort packages alphabetically 2020-03-24 09:21:01 +01:00
Grégoire Paris 827618c360 Validate composer files 2020-03-24 09:20:26 +01:00
Benjamin Eberlei 1a5837f909 [Build] Attempt at fix. 2020-03-23 20:41:18 +01:00
Benjamin Eberlei 1ab281861b [GH-36] Bugfix: TypedNoDefaultReflectionProperty::setValue NULL when null allowed. 2020-03-23 17:33:08 +01:00
Benjamin Eberlei b699ecc7f2 Merge pull request #35 from doctrine/GH-34-SetValueUnitialized
[GH-34] Instead of NULL, unitialize typed properties without default.
2020-03-21 12:34:59 +01:00
Benjamin Eberlei cd4811c644 [GH-34] Instead of NULL, unitialize typed properties without default. 2020-03-16 09:38:51 +01:00
Maciej Malarz aa0689034e Merge pull request #31 from Spomky/patch-1
No doc files for distribution
2020-02-28 21:27:16 +01:00
Florent Morselli 2fc2828857 No doc files for distribution
This PR adds the folder `/docs` in .gitattributes so that it will not be present in distribution
2020-02-28 14:43:01 +01:00
Claudio Zizza c7588e0baa Merge pull request #30 from doctrine/patch-1
Update of project config for latest version
2020-01-29 22:57:36 +01:00
Claudio Zizza d9cf1f3deb Update of project config for latest version
Because of a failing website build the config for the
latest version was adapted to the same version
syntax like in other Doctrine projects.
2020-01-29 00:23:19 +01:00
Andreas Braun 12fea966b2 Update branch-alias to 1.2.x-dev 2020-01-18 13:09:54 +01:00
Andreas Braun c390808aca Update maintained branches 2020-01-18 13:09:53 +01:00
23 changed files with 1311 additions and 667 deletions
+19 -1
View File
@@ -5,14 +5,32 @@
"docsSlug": "doctrine-reflection",
"versions": [
{
"name": "1.0",
"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
}
]
}
+1
View File
@@ -1,3 +1,4 @@
/docs export-ignore
/tests export-ignore
/.gitattributes export-ignore
/.gitignore export-ignore
+50
View File
@@ -0,0 +1,50 @@
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"
@@ -0,0 +1,45 @@
name: "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 }}
-29
View File
@@ -1,29 +0,0 @@
build:
nodes:
analysis:
environment:
php:
version: 7.1
cache:
disabled: false
directories:
- ~/.composer/cache
project_setup:
override: true
tests:
override:
- php-scrutinizer-run
- phpcs-run
dependencies:
override:
- composer install -noa
tools:
external_code_coverage:
timeout: 600
build_failure_conditions:
- 'elements.rating(<= C).new.exists' # No new classes/methods with a rating of C or worse allowed
- 'issues.label("coding-style").new.exists' # No new coding style issues allowed
- 'issues.severity(>= MAJOR).new.exists' # New issues of major or higher severity
- 'project.metric_change("scrutinizer.test_coverage", < 0)' # Code Coverage decreased from previous inspection
+11 -10
View File
@@ -1,7 +1,11 @@
dist: trusty
dist: xenial
sudo: false
language: php
env:
global:
- COMPOSER_ROOT_VERSION=1.2
cache:
directories:
- $HOME/.composer/cache
@@ -17,6 +21,7 @@ before_install:
- mv ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/xdebug.ini{,.disabled} || echo "xdebug not available"
install:
- composer validate --strict
- rm composer.lock
- travis_retry composer update -n --prefer-dist
@@ -33,16 +38,12 @@ jobs:
- if [[ ! $(php -m | grep -si xdebug) ]]; then echo "xdebug required for coverage"; exit 1; fi
script:
- ./vendor/bin/phpunit --coverage-clover clover.xml
after_script:
- wget https://scrutinizer-ci.com/ocular.phar
- php ocular.phar code-coverage:upload --format=php-clover clover.xml
- stage: Coding standard
install:
- travis_retry composer install -n --prefer-dist
script:
- ./vendor/bin/phpcs
after_success:
- bash <(curl -s https://codecov.io/bash)
- stage: Lint
install:
# Use lock file for install so old version of phpstan is used.
- travis_retry composer install -n --prefer-dist
php: 7.4
script: vendor/bin/phpstan analyse
+1 -2
View File
@@ -1,8 +1,7 @@
# Doctrine Reflection
[![Build Status](https://travis-ci.org/doctrine/reflection.svg)](https://travis-ci.org/doctrine/reflection)
[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/doctrine/reflection/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/doctrine/reflection/?branch=master)
[![Code Coverage](https://scrutinizer-ci.com/g/doctrine/reflection/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/doctrine/reflection/?branch=master)
[![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.
+10 -7
View File
@@ -17,16 +17,16 @@
{"name": "Marco Pivetta", "email": "ocramius@gmail.com"}
],
"require": {
"php": "^7.1",
"php": "^7.1 || ^8.0",
"ext-tokenizer": "*",
"doctrine/annotations": "^1.0"
},
"require-dev": {
"phpstan/phpstan": "^0.11.0",
"phpstan/phpstan-phpunit": "^0.11.0",
"phpunit/phpunit": "^7.0",
"doctrine/coding-standard": "^5.0",
"doctrine/common": "^2.10"
"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"
@@ -42,9 +42,12 @@
"Doctrine\\Tests_PHP74\\": "tests/Doctrine/Tests_PHP74"
}
},
"config": {
"sort-packages": true
},
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
"dev-master": "1.2.x-dev"
}
}
}
Generated
+926 -592
View File
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,24 @@
<?php
namespace Doctrine\Common\Reflection\Compatibility\Php7;
use ReflectionException;
trait ReflectionClass
{
/**
* {@inheritDoc}
*/
public function getConstants()
{
throw new ReflectionException('Method not implemented');
}
/**
* {@inheritDoc}
*/
public function newInstance($args)
{
throw new ReflectionException('Method not implemented');
}
}
@@ -0,0 +1,16 @@
<?php
namespace Doctrine\Common\Reflection\Compatibility\Php7;
use ReflectionException;
trait ReflectionMethod
{
/**
* {@inheritDoc}
*/
public function invoke($object, $parameter = null)
{
throw new ReflectionException('Method not implemented');
}
}
@@ -0,0 +1,24 @@
<?php
namespace Doctrine\Common\Reflection\Compatibility\Php8;
use ReflectionException;
trait ReflectionClass
{
/**
* {@inheritDoc}
*/
public function getConstants(?int $filter = null)
{
throw new ReflectionException('Method not implemented');
}
/**
* {@inheritDoc}
*/
public function newInstance(mixed ...$args)
{
throw new ReflectionException('Method not implemented');
}
}
@@ -0,0 +1,16 @@
<?php
namespace Doctrine\Common\Reflection\Compatibility\Php8;
use ReflectionException;
trait ReflectionMethod
{
/**
* {@inheritDoc}
*/
public function invoke(?object $object, mixed ...$args)
{
throw new ReflectionException('Method not implemented');
}
}
@@ -0,0 +1,18 @@
<?php
namespace Doctrine\Common\Reflection\Compatibility;
use const PHP_VERSION_ID;
use function class_alias;
if (PHP_VERSION_ID >= 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
{
}
}
@@ -0,0 +1,18 @@
<?php
namespace Doctrine\Common\Reflection\Compatibility;
use const PHP_VERSION_ID;
use function class_alias;
if (PHP_VERSION_ID >= 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
{
}
}
@@ -2,11 +2,14 @@
namespace Doctrine\Common\Reflection;
use Doctrine\Common\Reflection\Compatibility\ReflectionClass as CompatibilityReflectionClass;
use ReflectionClass;
use ReflectionException;
class StaticReflectionClass extends ReflectionClass
{
use CompatibilityReflectionClass;
/**
* The static reflection parser object.
*
@@ -83,14 +86,6 @@ class StaticReflectionClass extends ReflectionClass
throw new ReflectionException('Method not implemented');
}
/**
* {@inheritDoc}
*/
public function getConstants()
{
throw new ReflectionException('Method not implemented');
}
/**
* {@inheritDoc}
*/
@@ -371,14 +366,6 @@ class StaticReflectionClass extends ReflectionClass
throw new ReflectionException('Method not implemented');
}
/**
* {@inheritDoc}
*/
public function newInstance($args)
{
throw new ReflectionException('Method not implemented');
}
/**
* {@inheritDoc}
*/
@@ -2,11 +2,14 @@
namespace Doctrine\Common\Reflection;
use Doctrine\Common\Reflection\Compatibility\ReflectionMethod as CompatibilityReflectionMethod;
use ReflectionException;
use ReflectionMethod;
class StaticReflectionMethod extends ReflectionMethod
{
use CompatibilityReflectionMethod;
/**
* The PSR-0 parser object.
*
@@ -110,14 +113,6 @@ class StaticReflectionMethod extends ReflectionMethod
throw new ReflectionException('Method not implemented');
}
/**
* {@inheritDoc}
*/
public function invoke($object, $parameter = null)
{
throw new ReflectionException('Method not implemented');
}
/**
* {@inheritDoc}
*/
@@ -19,6 +19,7 @@ use const T_VAR;
use const T_VARIABLE;
use function array_merge;
use function file_get_contents;
use function is_array;
use function ltrim;
use function preg_match;
use function sprintf;
@@ -189,6 +190,9 @@ class StaticReflectionParser implements ReflectionProviderInterface
while (($token = $tokenParser->next()) && $token[0] !== T_STRING) {
continue;
}
if ($token === null) {
break;
}
$methodName = $token[1];
$this->docComment['method'][$methodName] = $docComment;
$docComment = '';
@@ -222,7 +226,7 @@ class StaticReflectionParser implements ReflectionProviderInterface
break;
}
$last_token = $token[0];
$last_token = is_array($token) ? $token[0] : false;
}
}
@@ -13,11 +13,36 @@ class TypedNoDefaultReflectionProperty extends ReflectionProperty
* {@inheritDoc}
*
* Checks that a typed property is initialized before accessing its value.
* This is neccessary to avoid PHP error "Error: Typed property must not be accessed before initialization".
* This is necessary to avoid PHP error "Error: Typed property must not be accessed before initialization".
* Should be used only for reflecting typed properties without a default value.
*/
public function getValue($object = null)
{
return $object !== null && $this->isInitialized($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);
}
}
+3
View File
@@ -7,5 +7,8 @@ parameters:
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
@@ -0,0 +1,13 @@
<?php
namespace Doctrine\Tests_PHP74\Common\Reflection\Dummies;
trait TokenParserAnonymousFunctionTestClass
{
protected function method()
{
return static function ($value) {
return $value;
};
}
}
@@ -0,0 +1,24 @@
<?php
namespace Doctrine\Tests_PHP74\Common\Reflection;
use Doctrine\Common\Reflection\Psr0FindFile;
use Doctrine\Common\Reflection\StaticReflectionParser;
use Doctrine\Tests_PHP74\Common\Reflection\Dummies\TokenParserAnonymousFunctionTestClass;
use PHPUnit\Framework\TestCase;
use function strlen;
use function substr;
class TokenParserAnonymousFunctionTest extends TestCase
{
public function testGetValue() : void
{
$testsRoot = substr(__DIR__, 0, -strlen(__NAMESPACE__) - 1);
$paths = [
'Doctrine\\Tests_PHP74' => [$testsRoot],
];
$staticReflectionParser = new StaticReflectionParser(TokenParserAnonymousFunctionTestClass::class, new Psr0FindFile($paths));
self::assertEquals('', $staticReflectionParser->getDocComment());
}
}
@@ -23,9 +23,64 @@ class TypedNoDefaultReflectionPropertyTest extends TestCase
self::assertNull($reflProperty->getValue($object));
}
public function testSetValueNull() : void
{
$reflection = new TypedNoDefaultReflectionProperty(TypedFoo::class, 'id');
$reflection->setAccessible(true);
$object = new TypedFoo();
$object->setId(1);
self::assertTrue($reflection->isInitialized($object));
$reflection->setValue($object, null);
self::assertNull($reflection->getValue($object));
self::assertFalse($reflection->isInitialized($object));
}
public function testSetValueNullOnNullableProperty() : void
{
$reflection = new TypedNoDefaultReflectionProperty(TypedNullableFoo::class, 'value');
$reflection->setAccessible(true);
$object = new TypedNullableFoo();
$reflection->setValue($object, null);
self::assertNull($reflection->getValue($object));
self::assertTrue($reflection->isInitialized($object));
self::assertNull($object->getValue());
}
}
class TypedNoDefaultReflectionPropertyTestClass
{
public string $test;
}
class TypedFoo
{
private int $id;
public function setId($id)
{
$this->id = $id;
}
}
class TypedNullableFoo
{
private ?string $value;
public function setValue($value)
{
$this->value = $value;
}
public function getValue()
{
return $this->value;
}
}