Skip to content

Commit ce48a00

Browse files
committed
Refactored code
1 parent 9033d33 commit ce48a00

40 files changed

+1004
-432
lines changed

.editorconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ ij_php_align_key_value_pairs = true
1010
ij_php_align_multiline_parameters_in_calls = true
1111
ij_php_align_phpdoc_comments = true
1212
ij_php_align_phpdoc_param_names = true
13+
ij_php_blank_lines_before_package = 0
1314
ij_php_comma_after_last_argument = true
1415
ij_php_comma_after_last_array_element = true
1516
ij_php_comma_after_last_closure_use_var = true

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,12 +112,12 @@ class StringTransformer extends Transformer
112112
{
113113
// I recommend using the Microsoft\PhpParser library to parse the source
114114
// code. It's already included in the dependencies of this package and
115-
// the "$code->sourceFileNode" property contains the parsed source code.
115+
// the "$code->getSourceFileNode()" property contains the parsed source code.
116116

117117
// But you can also use any other library or manually parse the source
118118
// code with basic PHP string functions and "$code->getOriginalSource()"
119119

120-
$sourceFileNode = $code->sourceFileNode;
120+
$sourceFileNode = $code->getSourceFileNode();
121121

122122
// Iterate over all nodes
123123
foreach ($sourceFileNode->getDescendantNodes() as $node) {
@@ -168,7 +168,7 @@ class UnPrivateTransformer extends Transformer
168168

169169
public function transform(Code $code): void
170170
{
171-
$sourceFileNode = $code->sourceFileNode;
171+
$sourceFileNode = $code->getSourceFileNode();
172172

173173
// Iterate over all tokens
174174
foreach ($sourceFileNode->getDescendantTokens() as $token) {

TODO.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# 1. Class Name matching
2+
Optimize the class name matching by using efficient data structures or
3+
algorithms (e.g. trie-based matching or regular expressions).
4+
5+
# 2. Cache management
6+
More sophisticated cache management strategy, such as Least Recently Used (LRU)
7+
or Time-To-Live (TTL) based eviction, to ensure that cache remains up-to-date
8+
and efficient.
9+
10+
# 3. Parallelization
11+
Parallelize the process of matching and transforming classes and methods to
12+
reduce the overall processing time.
13+
14+
# 4. Incremental updates
15+
Incremental update mechanism to process only new or changed classes and methods.
16+
17+
# 5. Monitoring
18+
Monitor the performance of the library to identify bottlenecks and areas that
19+
need optimization (e.g. Profilers or benchmarking suites).
20+
21+
# 6. Documentation
22+
- Document how to use xdebug with php-unit tests that use the
23+
`#[RunTestsInSeparateProcesses]` attribute (PhpStorm)
24+
- Create a flowchart

composer.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@
2828
"okapi/filesystem": "^1.0",
2929
"okapi/path": "^1.0",
3030
"okapi/singleton": "^1.0",
31-
"okapi/wildcards": "^1.0"
31+
"okapi/wildcards": "^1.0",
32+
"php-di/php-di": "^7.0",
33+
"roave/better-reflection": "^6.8"
3234
},
3335
"require-dev": {
3436
"phpunit/phpunit": "dev-main",

src/CodeTransformerKernel.php

Lines changed: 112 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22

33
namespace Okapi\CodeTransformer;
44

5+
use DI\Attribute\Inject;
56
use Okapi\CodeTransformer\Exception\Kernel\DirectKernelInitializationException;
67
use Okapi\CodeTransformer\Service\AutoloadInterceptor;
78
use Okapi\CodeTransformer\Service\CacheStateManager;
9+
use Okapi\CodeTransformer\Service\DI;
810
use Okapi\CodeTransformer\Service\Options;
911
use Okapi\CodeTransformer\Service\StreamFilter;
1012
use Okapi\CodeTransformer\Service\TransformerContainer;
@@ -24,55 +26,127 @@ abstract class CodeTransformerKernel
2426
{
2527
use Singleton;
2628

29+
// region Settings
30+
31+
/**
32+
* The cache directory.
33+
* <br><b>Default:</b> ROOT_DIR/cache/code-transformer<br>
34+
*
35+
* @var string|null
36+
*/
37+
protected ?string $cacheDir = null;
38+
39+
/**
40+
* The cache file mode.
41+
* <br><b>Default:</b> 0777 & ~{@link umask()}<br>
42+
*
43+
* @var int|null
44+
*/
45+
protected ?int $cacheFileMode = null;
46+
47+
/**
48+
* Enable debug mode. This will disable the cache.
49+
* <br><b>Default:</b> false<br>
50+
*
51+
* @var bool
52+
*/
53+
protected bool $debug = false;
54+
55+
// endregion
56+
2757
/**
2858
* List of transformers to be applied.
2959
*
3060
* @var class-string<Transformer>[]
3161
*/
3262
protected array $transformers = [];
3363

64+
// region DI
65+
66+
#[Inject]
67+
private Options $options;
68+
69+
#[Inject]
70+
protected TransformerContainer $transformerContainer;
71+
72+
#[Inject]
73+
private CacheStateManager $cacheStateManager;
74+
75+
#[Inject]
76+
private StreamFilter $streamFilter;
77+
78+
#[Inject]
79+
private AutoloadInterceptor $autoloadInterceptor;
80+
3481
/**
35-
* Initialize the kernel.
82+
* Make the constructor public to allow the DI container to instantiate the class.
83+
*/
84+
public function __construct() {}
85+
86+
// endregion
87+
88+
/**
89+
* Resolve instance with dependency injection.
3690
*
37-
* @param string|null $cacheDir The cache directory.
38-
* <br><b>Default:</b> ROOT_DIR/cache/code-transformer<br>
39-
* @param int|null $cacheFileMode The cache file mode.
40-
* <br><b>Default:</b> 0777 & ~{@link umask()}<br>
41-
* @param bool|null $debug Enable debug mode. This will disable the cache.
42-
* <br><b>Default:</b> false<br>
91+
* @inheritDoc
92+
*/
93+
public static function getInstance(): static
94+
{
95+
if (!isset(static::$instance)) {
96+
static::registerDependencyInjection();
97+
98+
static::$instance = DI::get(static::class);
99+
}
100+
101+
return static::$instance;
102+
}
103+
104+
/**
105+
* Initialize the kernel.
43106
*
44107
* @return void
45108
*/
46-
public static function init(
47-
?string $cacheDir,
48-
?int $cacheFileMode = null,
49-
bool $debug = false,
50-
): void {
51-
self::ensureNotKernelNamespace();
52-
53-
$instance = self::getInstance();
54-
$instance->ensureNotInitialized();
109+
public static function init(): void
110+
{
111+
static::ensureNotKernelNamespace();
55112

56-
// Only initialize the kernel if there are transformers
57-
if ($instance->transformers) {
58-
// Pre-initialize the services
113+
$instance = static::getInstance();
114+
$instance->ensureNotInitialized();
59115

60-
// Set options
61-
Options::setOptions(
62-
cacheDir: $cacheDir,
63-
cacheFileMode: $cacheFileMode,
64-
debug: $debug,
65-
);
116+
// Initialize the services
117+
$instance->preInit();
118+
$instance->registerServices();
119+
$instance->registerAutoloadInterceptor();
66120

67-
// Add the transformers
68-
TransformerContainer::addTransformers($instance->transformers);
121+
$instance->setInitialized();
122+
}
69123

70-
// Register the services
71-
$instance->registerServices();
72-
$instance->registerAutoloadInterceptor();
73-
}
124+
/**
125+
* Register the dependency injection.
126+
*
127+
* @return void
128+
*/
129+
protected static function registerDependencyInjection(): void
130+
{
131+
DI::getInstance()->register();
132+
}
74133

75-
$instance->setInitialized();
134+
/**
135+
* Pre-initialize the services.
136+
*
137+
* @return void
138+
*/
139+
protected function preInit(): void
140+
{
141+
// Set options
142+
$this->options->setOptions(
143+
cacheDir: $this->cacheDir,
144+
cacheFileMode: $this->cacheFileMode,
145+
debug: $this->debug,
146+
);
147+
148+
// Add the transformers
149+
$this->transformerContainer->addTransformers($this->transformers);
76150
}
77151

78152
/**
@@ -83,16 +157,16 @@ public static function init(
83157
protected function registerServices(): void
84158
{
85159
// Options provider
86-
Options::register();
160+
$this->options->register();
87161

88162
// Manage the user-defined transformers
89-
TransformerContainer::register();
163+
$this->transformerContainer->register();
90164

91165
// Cache path manager
92-
CacheStateManager::register();
166+
$this->cacheStateManager->register();
93167

94168
// Stream filter -> Source transformer
95-
StreamFilter::register();
169+
$this->streamFilter->register();
96170
}
97171

98172
/**
@@ -103,15 +177,15 @@ protected function registerServices(): void
103177
protected function registerAutoloadInterceptor(): void
104178
{
105179
// Overload the composer class loaders
106-
AutoloadInterceptor::register();
180+
$this->autoloadInterceptor->register();
107181
}
108182

109183
/**
110184
* Make sure that the kernel is not called from this class.
111185
*
112186
* @return void
113187
*/
114-
private static function ensureNotKernelNamespace(): void
188+
protected static function ensureNotKernelNamespace(): void
115189
{
116190
// Get current namespace and class name
117191
$namespace = get_called_class();

src/Exception/Transformer/InvalidTransformerClassException.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@
1313
class InvalidTransformerClassException extends TransformerException
1414
{
1515
/**
16-
* Create a new `TransformerMissingInterfaceException` instance.
16+
* InvalidTransformerClassException constructor.
1717
*
1818
* @param class-string $transformerClass
1919
*/
2020
public function __construct(string $transformerClass) {
2121
parent::__construct(
22-
message: "Transformer class '$transformerClass' does not extend the Transformer class.",
22+
"Transformer class '$transformerClass' does not extend the Transformer class.",
2323
);
2424
}
2525
}

src/Exception/Transformer/SyntaxError.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public function __construct(
2525
?SyntaxError $previous = null
2626
) {
2727
parent::__construct(
28-
"Syntax error in transformed code: $diagnostic->message\n\nFull code:\n$code",
28+
"Syntax error in transformed code: $diagnostic->message\n\nFull code:\n```php\n$code\n```",
2929
previous: $previous,
3030
);
3131
}

src/Exception/Transformer/TransformerNotFoundException.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@
1212
class TransformerNotFoundException extends TransformerException
1313
{
1414
/**
15-
* Create a new instance of the exception.
15+
* TransformerNotFoundException constructor.
1616
*
1717
* @param class-string $transformerClass
1818
*/
1919
public function __construct(string $transformerClass)
2020
{
2121
parent::__construct(
22-
message: "Transformer class '$transformerClass' does not exist.",
22+
"Transformer class '$transformerClass' does not exist.",
2323
);
2424
}
2525
}

src/Service/AutoloadInterceptor.php

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
namespace Okapi\CodeTransformer\Service;
44

55
use Composer\Autoload\ClassLoader as ComposerClassLoader;
6-
use Okapi\CodeTransformer\Service\AutoloadInterceptor\ClassLoader;
7-
use Okapi\Singleton\Singleton;
6+
use Okapi\CodeTransformer\Service\ClassLoader\ClassLoader;
87

98
/**
109
* # Autoload Interceptor
@@ -20,22 +19,20 @@
2019
*/
2120
class AutoloadInterceptor implements ServiceInterface
2221
{
23-
use Singleton;
22+
/**
23+
* The DI key for the original composer class loader.
24+
*/
25+
public const DI = 'okapi.code-transformer.service.composer.class-loader';
2426

2527
/**
2628
* Register the autoload interceptor.
2729
*
2830
* @return void
2931
*/
30-
public static function register(): void
32+
public function register(): void
3133
{
32-
$instance = self::getInstance();
33-
$instance->ensureNotInitialized();
34-
3534
// Overload existing composer loaders
36-
$instance->overloadComposerLoaders();
37-
38-
$instance->setInitialized();
35+
$this->overloadComposerLoaders();
3936
}
4037

4138
/**
@@ -60,8 +57,14 @@ private function overloadComposerLoaders(): void
6057
// @codeCoverageIgnoreEnd
6158
}
6259

60+
// Get the original composer loader
61+
$original = $loader[0];
62+
DI::set(self::DI, $original);
63+
6364
// Register the AOP class loader
64-
$loader[0] = new ClassLoader($loader[0]);
65+
$loader[0] = DI::make(ClassLoader::class, [
66+
'original' => $original,
67+
]);
6568

6669
// Unregister the original composer loader
6770
spl_autoload_unregister($loaderToUnregister);

0 commit comments

Comments
 (0)