8000 Merge branch '7.1' into 7.2 · symfony/property-info@b00580d · GitHub
[go: up one dir, main page]

Skip to content

Commit b00580d

Browse files
Merge branch '7.1' into 7.2
* 7.1: remove conflict with symfony/serializer < 6.4 Reviewed and Translated zh_CN [PropertyInfo] Fix write visibility for Asymmetric Visibility and Virtual Properties [Translation] [Bridge][Lokalise] Fix empty keys array in PUT, DELETE requests causing Lokalise API error
2 parents e2eb701 + e9a7b2a commit b00580d

File tree

4 files changed

+109
-7
lines changed

4 files changed

+109
-7
lines changed

Extractor/ReflectionExtractor.php

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -709,12 +709,18 @@ private function isAllowedProperty(string $class, string $property, bool $writeA
709709
try {
710710
$reflectionProperty = new \ReflectionProperty($class, $property);
711711

712-
if ($writeAccessRequired && $reflectionProperty->isReadOnly()) {
713-
return false;
714-
}
712+
if ($writeAccessRequired) {
713+
if ($reflectionProperty->isReadOnly()) {
714+
return false;
715+
}
716+
717+
if (\PHP_VERSION_ID >= 80400 && ($reflectionProperty->isProtectedSet() || $reflectionProperty->isPrivateSet())) {
718+
return false;
719+
}
715720

716-
if (\PHP_VERSION_ID >= 80400 && $writeAccessRequired && ($reflectionProperty->isProtectedSet() || $reflectionProperty->isPrivateSet())) {
717-
return false;
721+
if (\PHP_VERSION_ID >= 80400 &&$reflectionProperty->isVirtual() && !$reflectionProperty->hasHook(\PropertyHookType::Set)) {
722+
return false;
723+
}
718724
}
719725

720726
return (bool) ($reflectionProperty->getModifiers() & $this->propertyReflectionFlags);
@@ -955,6 +961,20 @@ private function getReadVisiblityForMethod(\ReflectionMethod $reflectionMethod):
955961

956962
private function getWriteVisiblityForProperty(\ReflectionProperty $reflectionProperty): string
957963
{
964+
if (\PHP_VERSION_ID >= 80400) {
965+
if ($reflectionProperty->isVirtual() && !$reflectionProperty->hasHook(\PropertyHookType::Set)) {
966+
return PropertyWriteInfo::VISIBILITY_PRIVATE;
967+
}
968+
969+
if ($reflectionProperty->isPrivateSet()) {
970+
return PropertyWriteInfo::VISIBILITY_PRIVATE;
971+
}
972+
973+
if ($reflectionProperty->isProtectedSet()) {
974+
return PropertyWriteInfo::VISIBILITY_PROTECTED;
975+
}
976+
}
977+
958978
if ($reflectionProperty->isPrivate()) {
959979
return PropertyWriteInfo::VISIBILITY_PRIVATE;
960980
}

Tests/Extractor/ReflectionExtractorTest.php

< 8000 span class="CopyToClipboardButton-module__tooltip--Dq1IB prc-TooltipV2-Tooltip-cYMVY" data-direction="s" aria-label="Copy file name to clipboard" aria-hidden="true" id=":Rjddlab:">Copy file name to clipboard
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
use Symfony\Component\PropertyInfo\Tests\Fixtures\Php81Dummy;
3333
use Symfony\Component\PropertyInfo\Tests\Fixtures\Php82Dummy;
3434
use Symfony\Component\PropertyInfo\Tests\Fixtures\SnakeCaseDummy;
35+
use Symfony\Component\PropertyInfo\Tests\Fixtures\VirtualProperties;
3536
use Symfony\Component\PropertyInfo\Type as LegacyType;
3637
use Symfony\Component\TypeInfo\Type;
3738
use Symfony\Component\TypeInfo\Type\NullableType;
@@ -702,6 +703,69 @@ public function testAsymmetricVisibility()
702703
$this->assertFalse($this->extractor->isWritable(AsymmetricVisibility::class, 'protectedPrivate'));
703704
}
704705

706+
/**
707+
* @requires PHP 8.4
708+
*/
709+
public function testVirtualProperties()
710+
{
711+
$this->assertTrue($this->extractor->isReadable(VirtualProperties::class, 'virtualNoSetHook'));
712+
$this->assertTrue($this->extractor->isReadable(VirtualProperties::class, 'virtualSetHookOnly'));
713+
$this->assertTrue($this->extractor->isReadable(VirtualProperties::class, 'virtualHook'));
714+
$this->assertFalse($this->extractor->isWritable(VirtualProperties::class, 'virtualNoSetHook'));
715+
$this->assertTrue($this->extractor->isWritable(VirtualProperties::class, 'virtualSetHookOnly'));
716+
$this->assertTrue($this->extractor->isWritable(VirtualProperties::class, 'virtualHook'));
717+
}
718+
719+
/**
720+
* @dataProvider provideAsymmetricVisibilityMutator
721+
* @requires PHP 8.4
722+
*/
723+
public function testAsymmetricVisibilityMutator(string $property, string $readVisibility, string $writeVisibility)
724+
{
725+
$extractor = new ReflectionExtractor(null, null, null, true, ReflectionExtractor::ALLOW_PUBLIC | ReflectionExtractor::ALLOW_PROTECTED | ReflectionExtractor::ALLOW_PRIVATE);
726+
$readMutator = $extractor->getReadInfo(AsymmetricVisibility::class, $property);
727+
$writeMutator = $extractor->getWriteInfo(AsymmetricVisibility::class, $property, [
728+
'enable_getter_setter_extraction' => true,
729+
]);
730+
731+
$this->assertSame(PropertyReadInfo::TYPE_PROPERTY, $readMutator->getType());
732+
$this->assertSame(PropertyWriteInfo::TYPE_PROPERTY, $writeMutator->getType());
733+
$this->assertSame($readVisibility, $readMutator->getVisibility());
734+
$this->assertSame($writeVisibility, $writeMutator->getVisibility());
735+
}
736+
737+
public static function provideAsymmetricVisibilityMutator(): iterable
738+
{
739+
yield ['publicPrivate', PropertyReadInfo::VISIBILITY_PUBLIC, PropertyWriteInfo::VISIBILITY_PRIVATE];
740+
yield ['publicProtected', PropertyReadInfo::VISIBILITY_PUBLIC, PropertyWriteInfo::VISIBILITY_PROTECTED];
741+
yield ['protectedPrivate', PropertyReadInfo::VISIBILITY_PROTECTED, PropertyWriteInfo::VISIBILITY_PRIVATE];
742+
}
743+
744+
/**
745+
* @dataProvider provideVirtualPropertiesMutator
746+
* @requires PHP 8.4
747+
*/
748+
public function testVirtualPropertiesMutator(string $property, string $readVisibility, string $writeVisibility)
749+
{
750+
$extractor = new ReflectionExtractor(null, null, null, true, ReflectionExtractor::ALLOW_PUBLIC | ReflectionExtractor::ALLOW_PROTECTED | ReflectionExtractor::ALLOW_PRIVATE);
751+
$readMutator = $extractor->getReadInfo(VirtualProperties::class, $property);
752+
$writeMutator = $extractor->getWriteInfo(VirtualProperties::class, $property, [
753+
'enable_getter_setter_extraction' => true,
754+
]);
755+
756+
$this->assertSame(PropertyReadInfo::TYPE_PROPERTY, $readMutator->getType());
757+
$this->assertSame(PropertyWriteInfo::TYPE_PROPERTY, $writeMutator->getType());
758+
$this->assertSame($readVisibility, $readMutator->getVisibility());
759+
$this->assertSame($writeVisibility, $writeMutator->getVisibility());
760+
}
761+
762+
public static function provideVirtualPropertiesMutator(): iterable
763+
{
764+
yield ['virtualNoSetHook', PropertyReadInfo::VISIBILITY_PUBLIC, PropertyWriteInfo::VISIBILITY_PRIVATE];
765+
yield ['virtualSetHookOnly', PropertyReadInfo::VISIBILITY_PUBLIC, PropertyWriteInfo::VISIBILITY_PUBLIC];
766+
yield ['virtualHook', PropertyReadInfo::VISIBILITY_PUBLIC, PropertyWriteInfo::VISIBILITY_PUBLIC];
767+
}
768+
705769
/**
706770
* @dataProvider typesProvider
707771
*/

Tests/Fixtures/VirtualProperties.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\PropertyInfo\Tests\Fixtures;
13+
14+
class VirtualProperties
15+
{
16+
public bool $virtualNoSetHook { get => true; }
17+
public bool $virtualSetHookOnly { set => $value; }
18+
public bool $virtualHook { get => true; set => $value; }
19+
}

composer.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,7 @@
3737
"conflict": {
3838
"phpdocumentor/reflection-docblock": "<5.2",
3939
"phpdocumentor/type-resolver": "<1.5.1",
40-
"symfony/dependency-injection": "<6.4",
41-
"symfony/serializer": "<6.4"
40+
"symfony/dependency-injection": "<6.4"
4241
},
4342
"autoload": {
4443
"psr-4": { "Symfony\\Component\\PropertyInfo\\": "" },

0 commit comments

Comments
 (0)
0