Skip to content

Commit 276c26d

Browse files
committed
Merge branch 'cleanup'
2 parents 886e4fb + c43e2c3 commit 276c26d

File tree

16 files changed

+193
-97
lines changed

16 files changed

+193
-97
lines changed

.phive/phars.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<phive xmlns="https://phar.io/phive">
3-
<phar name="lkrms/pretty-php" version="^0.4.48" installed="0.4.82" location="./tools/pretty-php" copy="true"/>
4-
<phar name="php-cs-fixer" version="^3.46.0" installed="3.65.0" location="./tools/php-cs-fixer" copy="true"/>
3+
<phar name="lkrms/pretty-php" version="^0.4.48" installed="0.4.87" location="./tools/pretty-php" copy="true"/>
4+
<phar name="php-cs-fixer" version="^3.46.0" installed="3.68.0" location="./tools/php-cs-fixer" copy="true"/>
55
<phar name="salient-labs/changelog" version="^1.0.5" installed="1.0.8" location="./tools/changelog" copy="true"/>
66
</phive>

composer.lock

Lines changed: 9 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

phpstan.neon.dist

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@ parameters:
2121
universalObjectCratesClasses:
2222
- Salient\Contract\Core\Entity\Extensible
2323
ignoreErrors:
24-
-
25-
identifier: property.unusedType
2624
-
2725
identifier: trait.unused
2826
-
@@ -81,7 +79,3 @@ parameters:
8179
- tests/fixtures/Toolkit/PHPStan/Utility/Type/ArrFlattenReturnTypeExtensionAssertions.php
8280
- tests/fixtures/Toolkit/PHPStan/Utility/Type/ArrWhereNotEmptyReturnTypeExtensionAssertions.php
8381
- tests/fixtures/Toolkit/PHPStan/Utility/Type/ArrWhereNotNullReturnTypeExtensionAssertions.php
84-
-
85-
identifier: property.unused
86-
paths:
87-
- tests/fixtures/Toolkit/PHPStan/Core/Rules/TypesAssignedByHasMutatorRuleFailures.php

scripts/generate.php

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
use Salient\Utility\File;
6565
use Salient\Utility\Json;
6666
use Salient\Utility\Package;
67+
use Salient\Utility\Reflect;
6768
use Salient\Utility\Regex;
6869

6970
$dir = dirname(__DIR__);
@@ -136,14 +137,9 @@
136137
$generateEntity = new GenerateSyncEntity($app);
137138
$generateProvider = new GenerateSyncProvider($app);
138139

139-
$class = new ReflectionClass(EnvVar::class);
140-
foreach ($class->getReflectionConstants() as $constant) {
141-
if (!$constant->isPublic()) {
142-
continue;
143-
}
144-
/** @var string */
145-
$value = $constant->getValue();
146-
Env::unset($value);
140+
/** @var string $name */
141+
foreach (Reflect::getConstants(EnvVar::class) as $name) {
142+
Env::unset($name);
147143
}
148144

149145
/** @var string[] */
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace Salient\PHPStan\Core\Rules;
4+
5+
use PHPStan\Reflection\PropertyReflection;
6+
use PHPStan\Rules\Properties\ReadWritePropertiesExtension;
7+
use Salient\Core\Concern\HasMutator;
8+
9+
class HasMutatorReadWritePropertiesExtension implements ReadWritePropertiesExtension
10+
{
11+
public function isAlwaysRead(PropertyReflection $property, string $propertyName): bool
12+
{
13+
return $this->classHasMutator($property);
14+
}
15+
16+
public function isAlwaysWritten(PropertyReflection $property, string $propertyName): bool
17+
{
18+
return $this->classHasMutator($property);
19+
}
20+
21+
public function isInitialized(PropertyReflection $property, string $propertyName): bool
22+
{
23+
return $this->classHasMutator($property);
24+
}
25+
26+
public function classHasMutator(PropertyReflection $property): bool
27+
{
28+
$classReflection = $property->getDeclaringClass();
29+
foreach ($classReflection->getTraits(true) as $traitReflection) {
30+
if ($traitReflection->getName() === HasMutator::class) {
31+
return true;
32+
}
33+
}
34+
return false;
35+
}
36+
}

src/Toolkit/PHPStan/phpstan.extension.neon

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
services:
2+
-
3+
class: Salient\PHPStan\Core\Rules\HasMutatorReadWritePropertiesExtension
4+
tags:
5+
- phpstan.properties.readWriteExtension
6+
27
-
38
class: Salient\PHPStan\Core\Rules\TypesAssignedByHasMutatorRule
49
tags:

src/Toolkit/Sync/Reflection/ReflectionSyncProvider.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,11 +137,12 @@ public function getSyncProviderReflectionEntities(): array
137137
*
138138
* @template T of SyncEntityInterface
139139
*
140-
* @param ReflectionSyncEntity<T>|class-string<T>|T $entity
140+
* @param ReflectionClass<T>|class-string<T>|T $entity
141141
*/
142142
public function isSyncEntityProvider($entity): bool
143143
{
144-
if ($entity instanceof ReflectionSyncEntity) {
144+
if ($entity instanceof ReflectionClass) {
145+
/** @var class-string<T> */
145146
$entity = $entity->name;
146147
} elseif ($entity instanceof SyncEntityInterface) {
147148
$entity = get_class($entity);

src/Toolkit/Sync/Support/SyncEntityProvider.php

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
use Salient\Contract\Sync\SyncStoreInterface;
1818
use Salient\Iterator\IterableIterator;
1919
use Salient\Sync\Exception\SyncOperationNotImplementedException;
20-
use Salient\Sync\Reflection\ReflectionSyncProvider;
2120
use Salient\Sync\SyncUtil;
2221
use Generator;
2322
use LogicException;
@@ -82,13 +81,7 @@ public function __construct(
8281
));
8382
}
8483

85-
if (!(new ReflectionSyncProvider($provider))->isSyncEntityProvider($entity)) {
86-
throw new LogicException(sprintf(
87-
'%s does not service %s',
88-
get_class($provider),
89-
$entity,
90-
));
91-
}
84+
$entity = SyncUtil::getServicedEntityType($entity, $provider, $container);
9285

9386
$this->Entity = $entity;
9487
$this->Provider = $provider;

src/Toolkit/Sync/SyncUtil.php

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,13 @@
88
use Salient\Contract\Sync\SyncProviderInterface;
99
use Salient\Contract\Sync\SyncStoreInterface;
1010
use Salient\Core\Facade\Sync;
11+
use Salient\Sync\Reflection\ReflectionSyncProvider;
1112
use Salient\Utility\AbstractUtility;
1213
use Salient\Utility\Arr;
1314
use Salient\Utility\Get;
1415
use Salient\Utility\Regex;
16+
use LogicException;
17+
use ReflectionClass;
1518

1619
final class SyncUtil extends AbstractUtility
1720
{
@@ -51,6 +54,51 @@ public static function isWriteOperation(int $operation): bool
5154
][$operation] ?? false;
5255
}
5356

57+
/**
58+
* With a sync entity type and any non-abstract parents bound to it in a
59+
* service container, get the first that is serviced by a provider
60+
*
61+
* @template T of SyncEntityInterface
62+
*
63+
* @param class-string<T> $entityType
64+
* @return class-string<T>
65+
* @throws LogicException if the provider does not service the entity type.
66+
*/
67+
public static function getServicedEntityType(
68+
string $entityType,
69+
SyncProviderInterface $provider,
70+
ContainerInterface $container
71+
): string {
72+
$provider = new ReflectionSyncProvider($provider);
73+
if ($provider->isSyncEntityProvider($entityType)) {
74+
return $entityType;
75+
}
76+
77+
$entity = new ReflectionClass($entityType);
78+
do {
79+
$entity = $entity->getParentClass();
80+
if (
81+
!$entity
82+
|| $entity->isAbstract()
83+
) {
84+
throw new LogicException(sprintf(
85+
'%s does not service %s',
86+
$provider->name,
87+
$entityType,
88+
));
89+
}
90+
if (
91+
is_a($container->getName($entity->name), $entityType, true)
92+
&& $provider->isSyncEntityProvider($entity)
93+
) {
94+
break;
95+
}
96+
} while (true);
97+
98+
/** @var class-string<T> */
99+
return $entity->name;
100+
}
101+
54102
/**
55103
* Get the name of a sync entity type's provider interface
56104
*

tests/fixtures/Toolkit/Sli/Command/AnalyseClass/MyClass.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ final class MyClass extends MyBaseClass
4141
// @phpstan-ignore property.unused
4242
private static ?int $MyNullableStaticTypedProperty;
4343

44-
// @phpstan-ignore property.onlyWritten
44+
// @phpstan-ignore property.onlyWritten, property.unusedType
4545
private static ?int $MyNullableStaticTypedPropertyWithDefault = null;
4646

4747
/**

0 commit comments

Comments
 (0)