Skip to content

Commit 852e1c0

Browse files
authored
Optimize collected data size (#168)
1 parent 137c6be commit 852e1c0

File tree

4 files changed

+39
-12
lines changed

4 files changed

+39
-12
lines changed

src/Collector/BufferedUsageCollector.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ private function tryFlushBuffer(
3232
return $data === []
3333
? null
3434
: array_map(
35-
static fn (CollectedUsage $usage): string => $usage->serialize(),
35+
static fn (CollectedUsage $usage): string => $usage->serialize($scope->getFile()),
3636
$data,
3737
);
3838
}

src/Graph/CollectedUsage.php

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,14 @@ public function concretizeMixedUsage(string $className): self
5252
);
5353
}
5454

55-
public function serialize(): string
55+
/**
56+
* Scope file is passed to optimize transferred data size (and thus result cache size)
57+
* - PHPStan itself transfers all collector data along with scope file
58+
* - thus if our data match those already-transferred ones, lets omit those
59+
*
60+
* @see https://github.com/phpstan/phpstan-src/blob/2fe4e0f94e75fe8844a21fdb81799f01f0591dfe/src/Analyser/FileAnalyser.php#L198
61+
*/
62+
public function serialize(string $scopeFile): string
5663
{
5764
$origin = $this->usage->getOrigin();
5865
$memberRef = $this->usage->getMemberRef();
@@ -63,7 +70,7 @@ public function serialize(): string
6370
'o' => [
6471
'c' => $origin->getClassName(),
6572
'm' => $origin->getMethodName(),
66-
'f' => $origin->getFile(),
73+
'f' => $origin->getFile() === $scopeFile ? '_' : $origin->getFile(),
6774
'l' => $origin->getLine(),
6875
'p' => $origin->getProvider(),
6976
'n' => $origin->getNote(),
@@ -82,7 +89,7 @@ public function serialize(): string
8289
}
8390
}
8491

85-
public static function deserialize(string $data): self
92+
public static function deserialize(string $data, string $scopeFile): self
8693
{
8794
try {
8895
/** @var array{e: string|null, t: MemberType::*, o: array{c: string|null, m: string|null, f: string|null, l: int|null, p: string|null, n: string|null}, m: array{c: string|null, m: string, d: bool}} $result */
@@ -92,7 +99,14 @@ public static function deserialize(string $data): self
9299
}
93100

94101
$memberType = $result['t'];
95-
$origin = new UsageOrigin($result['o']['c'], $result['o']['m'], $result['o']['f'], $result['o']['l'], $result['o']['p'], $result['o']['n']);
102+
$origin = new UsageOrigin(
103+
$result['o']['c'],
104+
$result['o']['m'],
105+
$result['o']['f'] === '_' ? $scopeFile : $result['o']['f'],
106+
$result['o']['l'],
107+
$result['o']['p'],
108+
$result['o']['n'],
109+
);
96110
$exclusionReason = $result['e'];
97111

98112
$usage = $memberType === MemberType::CONSTANT

src/Rule/DeadCodeRule.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,10 +158,10 @@ public function processNode(
158158
$memberUseData = array_merge_recursive($methodCallData, $providedUsagesData, $constFetchData);
159159
unset($methodCallData, $providedUsagesData, $constFetchData);
160160

161-
foreach ($memberUseData as $usesPerFile) {
161+
foreach ($memberUseData as $file => $usesPerFile) {
162162
foreach ($usesPerFile as $useStrings) {
163163
foreach ($useStrings as $useString) {
164-
$collectedUsage = CollectedUsage::deserialize($useString);
164+
$collectedUsage = CollectedUsage::deserialize($useString, $file);
165165
$memberUsage = $collectedUsage->getUsage();
166166

167167
if ($memberUsage->getMemberRef()->getClassName() === null) {

tests/Graph/SerializationTest.php

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,31 @@ class SerializationTest extends TestCase
1010
/**
1111
* @dataProvider provideData
1212
*/
13-
public function testSerialization(CollectedUsage $expected, string $serialized): void
13+
public function testSerialization(string $filePath, CollectedUsage $expected, string $serialized): void
1414
{
15-
self::assertSame($serialized, $expected->serialize());
16-
self::assertEquals($expected, CollectedUsage::deserialize($serialized));
15+
self::assertSame($serialized, $expected->serialize($filePath));
16+
self::assertEquals($expected, CollectedUsage::deserialize($serialized, $filePath));
1717
}
1818

1919
/**
20-
* @return iterable<array{CollectedUsage, string}>
20+
* @return iterable<string, array{string, CollectedUsage, string}>
2121
*/
2222
public static function provideData(): iterable
2323
{
24-
yield [
24+
yield 'path optimized' => [
25+
'/app/index.php',
26+
new CollectedUsage(
27+
new ClassConstantUsage(
28+
new UsageOrigin('Clazz', 'method', '/app/index.php', 7, null, null),
29+
new ClassConstantRef(null, 'CONSTANT', true),
30+
),
31+
'excluder',
32+
),
33+
'{"e":"excluder","t":2,"o":{"c":"Clazz","m":"method","f":"_","l":7,"p":null,"n":null},"m":{"c":null,"m":"CONSTANT","d":true}}',
34+
];
35+
36+
yield 'path differs' => [
37+
'/app/different.php',
2538
new CollectedUsage(
2639
new ClassConstantUsage(
2740
new UsageOrigin('Clazz', 'method', '/app/index.php', 7, null, null),

0 commit comments

Comments
 (0)