Skip to content

Commit 67a0f18

Browse files
authored
Merge pull request #1 from okapi-web/develop
Develop
2 parents 9033d33 + 336a9d0 commit 67a0f18

File tree

68 files changed

+2343
-1170
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

68 files changed

+2343
-1170
lines changed

.editorconfig

+1
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

+5-5
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@ class Kernel extends CodeTransformerKernel
9292

9393
<?php
9494

95-
use Okapi\CodeTransformer\Service\StreamFilter\Metadata\Code;
9695
use Okapi\CodeTransformer\Transformer;
96+
use Okapi\CodeTransformer\Transformer\Code;
9797

9898
// Extend from the "Transformer" class
9999
class StringTransformer extends Transformer
@@ -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) {
@@ -155,8 +155,8 @@ class StringTransformer extends Transformer
155155
namespace Okapi\CodeTransformer\Tests\Stubs\Transformer;
156156

157157
use Microsoft\PhpParser\TokenKind;
158-
use Okapi\CodeTransformer\Service\StreamFilter\Metadata\Code;
159158
use Okapi\CodeTransformer\Transformer;
159+
use Okapi\CodeTransformer\Transformer\Code;
160160

161161
// Replace all "private" keywords with "public"
162162
class UnPrivateTransformer extends Transformer
@@ -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

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
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
25+
26+
# 7. Testing
27+
- Add tests for the `order` property of the `Transformer` class

composer.json

+8-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "okapi/code-transformer",
33
"description": "PHP Code Transformer is a PHP library that allows you to modify and transform the source code of a loaded PHP class.",
4-
"version": "1.1.1",
4+
"version": "1.2.0",
55
"type": "library",
66
"homepage": "https://github.com/okapi-web/php-code-transformer",
77
"license": "MIT",
@@ -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",
@@ -37,7 +39,10 @@
3739
"autoload": {
3840
"psr-4": {
3941
"Okapi\\CodeTransformer\\": "src/"
40-
}
42+
},
43+
"files": [
44+
"src/functions.php"
45+
]
4146
},
4247
"autoload-dev": {
4348
"psr-4": {

src/CodeTransformerKernel.php

+119-45
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,20 @@
22

33
namespace Okapi\CodeTransformer;
44

5-
use Okapi\CodeTransformer\Exception\Kernel\DirectKernelInitializationException;
6-
use Okapi\CodeTransformer\Service\AutoloadInterceptor;
7-
use Okapi\CodeTransformer\Service\CacheStateManager;
8-
use Okapi\CodeTransformer\Service\Options;
9-
use Okapi\CodeTransformer\Service\StreamFilter;
10-
use Okapi\CodeTransformer\Service\TransformerContainer;
5+
use DI\Attribute\Inject;
6+
use Okapi\CodeTransformer\Core\AutoloadInterceptor;
7+
use Okapi\CodeTransformer\Core\Cache\CacheStateManager;
8+
use Okapi\CodeTransformer\Core\Container\TransformerManager;
9+
use Okapi\CodeTransformer\Core\DI;
10+
use Okapi\CodeTransformer\Core\Exception\Kernel\DirectKernelInitializationException;
11+
use Okapi\CodeTransformer\Core\Options;
12+
use Okapi\CodeTransformer\Core\StreamFilter;
1113
use Okapi\Singleton\Singleton;
1214

1315
/**
1416
* # Code Transformer Kernel
1517
*
16-
* The `CodeTransformerKernel` is the heart of the Code Transformer library.
18+
* This class is the heart of the Code Transformer library.
1719
* It manages an environment for Code Transformation.
1820
*
1921
* 1. Extends this class and define a list of transformers in the
@@ -24,6 +26,58 @@ abstract class CodeTransformerKernel
2426
{
2527
use Singleton;
2628

29+
// region DI
30+
31+
#[Inject]
32+
private Options $options;
33+
34+
#[Inject]
35+
protected TransformerManager $transformerContainer;
36+
37+
#[Inject]
38+
private CacheStateManager $cacheStateManager;
39+
40+
#[Inject]
41+
private StreamFilter $streamFilter;
42+
43+
#[Inject]
44+
private AutoloadInterceptor $autoloadInterceptor;
45+
46+
/**
47+
* Make the constructor public to allow the DI container to instantiate the class.
48+
*/
49+
public function __construct() {}
50+
51+
// endregion
52+
53+
// region Settings
54+
55+
/**
56+
* The cache directory.
57+
* <br><b>Default:</b> ROOT_DIR/cache/code-transformer<br>
58+
*
59+
* @var string|null
60+
*/
61+
protected ?string $cacheDir = null;
62+
63+
/**
64+
* The cache file mode.
65+
* <br><b>Default:</b> 0777 & ~{@link umask()}<br>
66+
*
67+
* @var int|null
68+
*/
69+
protected ?int $cacheFileMode = null;
70+
71+
/**
72+
* Enable debug mode. This will disable the cache.
73+
* <br><b>Default:</b> false<br>
74+
*
75+
* @var bool
76+
*/
77+
protected bool $debug = false;
78+
79+
// endregion
80+
2781
/**
2882
* List of transformers to be applied.
2983
*
@@ -32,47 +86,67 @@ abstract class CodeTransformerKernel
3286
protected array $transformers = [];
3387

3488
/**
35-
* Initialize the kernel.
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();

0 commit comments

Comments
 (0)