Skip to content

Commit d4abd99

Browse files
committed
Moved "TransformerProcessor" to "Processor" folder
1 parent e32636c commit d4abd99

File tree

2 files changed

+142
-121
lines changed

2 files changed

+142
-121
lines changed
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
<?php
2+
/** @noinspection PhpPropertyOnlyWrittenInspection */
3+
namespace Okapi\CodeTransformer\Core\Processor;
4+
5+
use DI\Attribute\Inject;
6+
use Okapi\CodeTransformer\Core\Cache\CachePaths;
7+
use Okapi\CodeTransformer\Core\Cache\CacheState\NoTransformationsCacheState;
8+
use Okapi\CodeTransformer\Core\Cache\CacheState\TransformedCacheState;
9+
use Okapi\CodeTransformer\Core\Cache\CacheStateManager;
10+
use Okapi\CodeTransformer\Core\Container\TransformerContainer;
11+
use Okapi\CodeTransformer\Core\DI;
12+
use Okapi\CodeTransformer\Core\Matcher\TransformerMatcher;
13+
use Okapi\CodeTransformer\Core\StreamFilter\Metadata;
14+
use Okapi\Filesystem\Filesystem;
15+
use ReflectionClass as BaseReflectionClass;
16+
17+
/**
18+
* # Transformer Processor
19+
*
20+
* This class is used to process the transformers.
21+
*/
22+
class TransformerProcessor
23+
{
24+
// region DI
25+
26+
#[Inject]
27+
protected TransformerMatcher $transformerMatcher;
28+
29+
#[Inject]
30+
protected CachePaths $cachePaths;
31+
32+
#[Inject]
33+
protected CacheStateManager $cacheStateManager;
34+
35+
// endregion
36+
37+
/**
38+
* Transform the code.
39+
*
40+
* @param Metadata $metadata
41+
*
42+
* @return void
43+
*/
44+
public function transform(Metadata $metadata): void
45+
{
46+
$namespacedClass = $metadata->code->getNamespacedClass();
47+
48+
// Process the transformers
49+
$transformerContainers = $this->transformerMatcher->getMatchedTransformerContainers($namespacedClass);
50+
$this->processTransformers($metadata, $transformerContainers);
51+
52+
$originalFilePath = $metadata->uri;
53+
$cacheFilePath = $this->cachePaths->getTransformedCachePath($originalFilePath);
54+
$transformed = $metadata->code->hasChanges();
55+
56+
// Save the transformed code
57+
if ($transformed) {
58+
Filesystem::writeFile(
59+
$cacheFilePath,
60+
$metadata->code->getNewSource(),
61+
);
62+
}
63+
64+
// Update the cache state
65+
$modificationTime = $_SERVER['REQUEST_TIME'] ?? time();
66+
if ($transformed) {
67+
$transformerFilePaths = $this->getTransformerFilePaths($transformerContainers);
68+
69+
$cacheState = DI::make(TransformedCacheState::class, [
70+
'data' => [
71+
'originalFilePath' => $originalFilePath,
72+
'modificationTime' => $modificationTime,
73+
'transformedFilePath' => $cacheFilePath,
74+
'transformerFilePaths' => $transformerFilePaths,
75+
],
76+
]);
77+
} else {
78+
$cacheState = DI::make(NoTransformationsCacheState::class, [
79+
'data' => [
80+
'originalFilePath' => $originalFilePath,
81+
'modificationTime' => $modificationTime,
82+
],
83+
]);
84+
}
85+
86+
$this->cacheStateManager->setCacheState($originalFilePath, $cacheState);
87+
}
88+
89+
/**
90+
* Process the transformers.
91+
*
92+
* @param Metadata $metadata
93+
* @param TransformerContainer[] $transformerContainers
94+
*
95+
* @return void
96+
*/
97+
protected function processTransformers(
98+
Metadata $metadata,
99+
array $transformerContainers,
100+
): void {
101+
// Sort the transformers by priority
102+
usort(
103+
$transformerContainers,
104+
function (TransformerContainer $a, TransformerContainer $b) {
105+
return $a->transformerInstance->order <=> $b->transformerInstance->order;
106+
},
107+
);
108+
109+
foreach ($transformerContainers as $transformerContainer) {
110+
$transformerContainer->transformerInstance->transform(
111+
$metadata->code,
112+
);
113+
}
114+
}
115+
116+
/**
117+
* Get the file paths of the given transformers.
118+
*
119+
* @param TransformerContainer[] $transformerContainers
120+
*
121+
* @return string[]
122+
*
123+
* @noinspection PhpDocMissingThrowsInspection Handled by TransformerNotFoundException
124+
*
125+
* @todo: Move this logic to the CacheStateManager by checking
126+
* if the transformers exist and are up-to-date.
127+
*/
128+
protected function getTransformerFilePaths(
129+
array $transformerContainers
130+
): array {
131+
return array_map(
132+
function (TransformerContainer $transformerContainer) {
133+
/** @noinspection PhpUnhandledExceptionInspection Handled by TransformerNotFoundException */
134+
$reflection = new BaseReflectionClass(
135+
$transformerContainer->transformerInstance
136+
);
137+
return $reflection->getFileName();
138+
},
139+
$transformerContainers,
140+
);
141+
}
142+
}

src/Service/Processor/TransformerProcessor.php

Lines changed: 0 additions & 121 deletions
This file was deleted.

0 commit comments

Comments
 (0)