diff --git a/README.md b/README.md
index 59e8864..05957e6 100644
--- a/README.md
+++ b/README.md
@@ -63,6 +63,7 @@ composer require okapi/code-transformer
- [Create a transformer](#create-a-transformer)
- [Initialize the kernel](#initialize-the-kernel)
- [Result](#result)
+- [Limitations](#limitations)
@@ -251,6 +252,15 @@ $iAmAppended = true;
```
+# Limitations
+
+- Normally xdebug will point to the original source code, not the transformed
+ one. The problem with this is if you add or remove a line of code, xdebug
+ will point to the wrong line, so try to keep the number of lines the same
+ as the original source code.
+
+
+
# How it works
- The `Kernel` registers multiple services
diff --git a/TODO.md b/TODO.md
index c2e17a3..ed313f3 100644
--- a/TODO.md
+++ b/TODO.md
@@ -25,3 +25,8 @@ need optimization (e.g. Profilers or benchmarking suites).
# 7. Testing
- Add tests for the `order` property of the `Transformer` class
+
+# 8. Production/Development support
+- Add support for production/development environments:
+ - Production: Cache will not be checked for updates (better performance).
+ - Development: Cache will be checked for updates (better debugging experience).
diff --git a/composer.json b/composer.json
index c99a8ca..62c5241 100644
--- a/composer.json
+++ b/composer.json
@@ -1,7 +1,7 @@
{
"name": "okapi/code-transformer",
"description": "PHP Code Transformer is a PHP library that allows you to modify and transform the source code of a loaded PHP class.",
- "version": "1.3.0",
+ "version": "1.3.1",
"type": "library",
"homepage": "https://github.com/okapi-web/php-code-transformer",
"license": "MIT",
diff --git a/phpunit.xml b/phpunit.xml
index 0711701..554a5b0 100644
--- a/phpunit.xml
+++ b/phpunit.xml
@@ -1,18 +1,18 @@
-
-
-
-
- tests/
-
-
-
-
-
- src/
-
-
-
+
+
+
+
+ tests/
+
+
+
+
+
+ src/
+
+
+
diff --git a/src/CodeTransformerKernel.php b/src/CodeTransformerKernel.php
index 9323179..0b0a364 100644
--- a/src/CodeTransformerKernel.php
+++ b/src/CodeTransformerKernel.php
@@ -32,7 +32,7 @@ abstract class CodeTransformerKernel
private Options $options;
#[Inject]
- protected TransformerManager $transformerContainer;
+ protected TransformerManager $transformerManager;
#[Inject]
private CacheStateManager $cacheStateManager;
@@ -146,7 +146,7 @@ protected function preInit(): void
);
// Add the transformers
- $this->transformerContainer->addTransformers($this->transformers);
+ $this->transformerManager->addTransformers($this->transformers);
}
/**
@@ -160,7 +160,7 @@ protected function registerServices(): void
$this->options->register();
// Manage the user-defined transformers
- $this->transformerContainer->register();
+ $this->transformerManager->register();
// Cache path manager
$this->cacheStateManager->register();
diff --git a/src/Core/AutoloadInterceptor.php b/src/Core/AutoloadInterceptor.php
index 4a49c67..b5a2753 100644
--- a/src/Core/AutoloadInterceptor.php
+++ b/src/Core/AutoloadInterceptor.php
@@ -1,9 +1,11 @@
reflectionHelper->setClassLoader($originalClassLoader);
- // Register the AOP class loader
+ // Create the Code Transformer class loader
$loader[0] = DI::make(ClassLoader::class, [
'originalClassLoader' => $originalClassLoader,
]);
@@ -69,7 +73,7 @@ private function overloadComposerLoaders(): void
// Unregister the original composer loader
spl_autoload_unregister($loaderToUnregister);
- // Register the AOP class loader
+ // Register the Code Transformer class loader
spl_autoload_register($loader);
}
}
diff --git a/src/Core/AutoloadInterceptor/ClassLoader.php b/src/Core/AutoloadInterceptor/ClassLoader.php
index 88aea7e..631b51f 100644
--- a/src/Core/AutoloadInterceptor/ClassLoader.php
+++ b/src/Core/AutoloadInterceptor/ClassLoader.php
@@ -27,7 +27,7 @@ class ClassLoader extends ComposerClassLoader
// region DI
#[Inject]
- private TransformerMatcher $transformerMatcher;
+ protected TransformerMatcher $transformerMatcher;
#[Inject]
protected CacheStateManager $cacheStateManager;
diff --git a/src/Core/Cache/CacheState/TransformedCacheState.php b/src/Core/Cache/CacheState/TransformedCacheState.php
index 0eb4841..da0dff0 100644
--- a/src/Core/Cache/CacheState/TransformedCacheState.php
+++ b/src/Core/Cache/CacheState/TransformedCacheState.php
@@ -52,6 +52,10 @@ public function isFresh(): bool
return false;
// @codeCoverageIgnoreEnd
}
+
+ if (filemtime($transformerFilePath) > $this->modificationTime) {
+ return false;
+ }
}
return true;
diff --git a/src/Core/Cache/CacheStateManager.php b/src/Core/Cache/CacheStateManager.php
index d5d8fcb..4c86a7e 100644
--- a/src/Core/Cache/CacheStateManager.php
+++ b/src/Core/Cache/CacheStateManager.php
@@ -92,6 +92,7 @@ private function initializeCacheDirectory(): void
Filesystem::mkdir(
$this->options->getCacheDir(),
$this->options->getCacheFileMode(),
+ recursive: true,
);
}
diff --git a/src/Core/Util/ReflectionHelper.php b/src/Core/Util/ReflectionHelper.php
new file mode 100644
index 0000000..76d1c86
--- /dev/null
+++ b/src/Core/Util/ReflectionHelper.php
@@ -0,0 +1,52 @@
+classLoader = $classLoader;
+ }
+
+ /**
+ * Get reflection class.
+ *
+ * @param class-string $namespacedClass
+ *
+ * @return ReflectionClass
+ */
+ public function getReflectionClass(string $namespacedClass): ReflectionClass
+ {
+ $astLocator = (new BetterReflection())->astLocator();
+ $reflector = new DefaultReflector(new AggregateSourceLocator([
+ new ComposerSourceLocator($this->classLoader, $astLocator),
+ new PhpInternalSourceLocator($astLocator, new ReflectionSourceStubber()),
+ ]));
+
+ return $reflector->reflectClass($namespacedClass);
+ }
+}
diff --git a/src/Transformer/Code.php b/src/Transformer/Code.php
index ff6eb05..4781444 100644
--- a/src/Transformer/Code.php
+++ b/src/Transformer/Code.php
@@ -1,18 +1,17 @@
stringMutator->edit(
$token->getStartPosition(),
$token->getWidth(),
@@ -146,17 +155,9 @@ public function getSourceFileNode(): SourceFileNode
*/
public function getReflectionClass(): BetterReflectionClass
{
- static $classLoader, $astLocator, $reflector;
-
- if (!isset($classLoader, $astLocator, $reflector)) {
- $classLoader = DI::get(AutoloadInterceptor::DI);
- $astLocator = (new BetterReflection)->astLocator();
- $reflector = (new DefaultReflector(
- new ComposerSourceLocator($classLoader, $astLocator)
- ));
- }
-
- return $reflector->reflectClass($this->getNamespacedClass());
+ return $this->reflectionHelper->getReflectionClass(
+ $this->getNamespacedClass(),
+ );
}
/**
diff --git a/tests/Stubs/Kernel/AddedTransformerKernel.php b/tests/Stubs/Kernel/AddedTransformerKernel.php
index 88ee744..aa2a8aa 100644
--- a/tests/Stubs/Kernel/AddedTransformerKernel.php
+++ b/tests/Stubs/Kernel/AddedTransformerKernel.php
@@ -14,6 +14,6 @@ protected function preInit(): void
{
parent::preInit();
- $this->transformerContainer->addTransformers($this->addedTransformers);
+ $this->transformerManager->addTransformers($this->addedTransformers);
}
}