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); } }