Skip to content

Commit ad52831

Browse files
committed
Added "ReflectionHelper"
1 parent c2984a9 commit ad52831

File tree

4 files changed

+85
-28
lines changed

4 files changed

+85
-28
lines changed

src/Core/AutoloadInterceptor.php

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
<?php
2-
2+
/** @noinspection PhpPropertyOnlyWrittenInspection */
33
namespace Okapi\CodeTransformer\Core;
44

55
use Composer\Autoload\ClassLoader as ComposerClassLoader;
6+
use DI\Attribute\Inject;
67
use Okapi\CodeTransformer\Core\AutoloadInterceptor\ClassLoader;
8+
use Okapi\CodeTransformer\Core\Util\ReflectionHelper;
79

810
/**
911
* # Autoload Interceptor
@@ -19,10 +21,12 @@
1921
*/
2022
class AutoloadInterceptor implements ServiceInterface
2123
{
22-
/**
23-
* The DI key for the original composer class loader.
24-
*/
25-
public const DI = 'okapi.code-transformer.service.composer.class-loader';
24+
// region DI
25+
26+
#[Inject]
27+
private ReflectionHelper $reflectionHelper;
28+
29+
// endregion
2630

2731
/**
2832
* Register the autoload interceptor.
@@ -59,17 +63,17 @@ private function overloadComposerLoaders(): void
5963

6064
// Get the original composer loader
6165
$originalClassLoader = $loader[0];
62-
DI::set(static::DI, $originalClassLoader);
66+
$this->reflectionHelper->setClassLoader($originalClassLoader);
6367

64-
// Register the AOP class loader
68+
// Create the Code Transformer class loader
6569
$loader[0] = DI::make(ClassLoader::class, [
6670
'originalClassLoader' => $originalClassLoader,
6771
]);
6872

6973
// Unregister the original composer loader
7074
spl_autoload_unregister($loaderToUnregister);
7175

72-
// Register the AOP class loader
76+
// Register the Code Transformer class loader
7377
spl_autoload_register($loader);
7478
}
7579
}

src/Core/AutoloadInterceptor/ClassLoader.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class ClassLoader extends ComposerClassLoader
2727
// region DI
2828

2929
#[Inject]
30-
private TransformerMatcher $transformerMatcher;
30+
protected TransformerMatcher $transformerMatcher;
3131

3232
#[Inject]
3333
protected CacheStateManager $cacheStateManager;

src/Core/Util/ReflectionHelper.php

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
/** @noinspection PhpInternalEntityUsedInspection */
3+
namespace Okapi\CodeTransformer\Core\Util;
4+
5+
use Composer\Autoload\ClassLoader;
6+
use Roave\BetterReflection\BetterReflection;
7+
use Roave\BetterReflection\Reflection\ReflectionClass;
8+
use Roave\BetterReflection\Reflector\DefaultReflector;
9+
use Roave\BetterReflection\SourceLocator\SourceStubber\ReflectionSourceStubber;
10+
use Roave\BetterReflection\SourceLocator\Type\AggregateSourceLocator;
11+
use Roave\BetterReflection\SourceLocator\Type\ComposerSourceLocator;
12+
use Roave\BetterReflection\SourceLocator\Type\PhpInternalSourceLocator;
13+
14+
/**
15+
* # Reflection Helper
16+
*
17+
* This class is used to get reflection class.
18+
*/
19+
class ReflectionHelper
20+
{
21+
private ClassLoader $classLoader;
22+
23+
/**
24+
* Set class loader.
25+
*
26+
* @param ClassLoader $classLoader
27+
*
28+
* @return void
29+
*/
30+
public function setClassLoader(ClassLoader $classLoader): void
31+
{
32+
$this->classLoader = $classLoader;
33+
}
34+
35+
/**
36+
* Get reflection class.
37+
*
38+
* @param class-string $namespacedClass
39+
*
40+
* @return ReflectionClass
41+
*/
42+
public function getReflectionClass(string $namespacedClass): ReflectionClass
43+
{
44+
$astLocator = (new BetterReflection())->astLocator();
45+
$reflector = new DefaultReflector(new AggregateSourceLocator([
46+
new ComposerSourceLocator($this->classLoader, $astLocator),
47+
new PhpInternalSourceLocator($astLocator, new ReflectionSourceStubber()),
48+
]));
49+
50+
return $reflector->reflectClass($namespacedClass);
51+
}
52+
}

src/Transformer/Code.php

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
<?php
2-
2+
/** @noinspection PhpPropertyOnlyWrittenInspection */
33
namespace Okapi\CodeTransformer\Transformer;
44

5+
use DI\Attribute\Inject;
6+
use Microsoft\PhpParser\Node;
57
use Microsoft\PhpParser\Node\SourceFileNode;
68
use Microsoft\PhpParser\Parser;
79
use Microsoft\PhpParser\Token;
8-
use Okapi\CodeTransformer\Core\AutoloadInterceptor;
910
use Okapi\CodeTransformer\Core\DI;
1011
use Okapi\CodeTransformer\Core\Util\CodeChecker;
12+
use Okapi\CodeTransformer\Core\Util\ReflectionHelper;
1113
use Okapi\CodeTransformer\Core\Util\StringMutator;
12-
use Roave\BetterReflection\BetterReflection;
1314
use Roave\BetterReflection\Reflection\ReflectionClass as BetterReflectionClass;
14-
use Roave\BetterReflection\Reflector\DefaultReflector;
15-
use Roave\BetterReflection\SourceLocator\Type\ComposerSourceLocator;
1615

1716
/**
1817
* # Code
@@ -22,6 +21,13 @@
2221
*/
2322
class Code
2423
{
24+
// region DI
25+
26+
#[Inject]
27+
private ReflectionHelper $reflectionHelper;
28+
29+
// endregion
30+
2531
/**
2632
* String mutator.
2733
*
@@ -64,13 +70,16 @@ public function __construct(
6470
/**
6571
* Add an edit to the source code.
6672
*
67-
* @param Token $token The token to edit.
68-
* @param string $replacement The replacement string.
73+
* @param Token|Node $token The token or node to edit.
74+
* @param string $replacement The replacement string.
6975
*
7076
* @return void
77+
*
78+
* @noinspection PhpDocMissingThrowsInspection
7179
*/
72-
public function edit(Token $token, string $replacement): void
80+
public function edit(Token|Node $token, string $replacement): void
7381
{
82+
/** @noinspection PhpUnhandledExceptionInspection */
7483
$this->stringMutator->edit(
7584
$token->getStartPosition(),
7685
$token->getWidth(),
@@ -146,17 +155,9 @@ public function getSourceFileNode(): SourceFileNode
146155
*/
147156
public function getReflectionClass(): BetterReflectionClass
148157
{
149-
static $classLoader, $astLocator, $reflector;
150-
151-
if (!isset($classLoader, $astLocator, $reflector)) {
152-
$classLoader = DI::get(AutoloadInterceptor::DI);
153-
$astLocator = (new BetterReflection)->astLocator();
154-
$reflector = (new DefaultReflector(
155-
new ComposerSourceLocator($classLoader, $astLocator)
156-
));
157-
}
158-
159-
return $reflector->reflectClass($this->getNamespacedClass());
158+
return $this->reflectionHelper->getReflectionClass(
159+
$this->getNamespacedClass(),
160+
);
160161
}
161162

162163
/**

0 commit comments

Comments
 (0)