diff --git a/src/Console/Commands/Compose.php b/src/Console/Commands/Compose.php index a7769eb4..7aa4860d 100644 --- a/src/Console/Commands/Compose.php +++ b/src/Console/Commands/Compose.php @@ -45,12 +45,13 @@ protected function execute(InputInterface $input, OutputInterface $output) $this->replacer = new Replacer($workingDir, $config); $packages = $this->findPackages($config->packages); + $namespacesToSkip = $this->config->namespaces_to_skip ?? []; $this->movePackages($packages); - $this->replacePackages($packages); + $this->replacePackages($packages, $namespacesToSkip); foreach ($packages as $package) { - $this->replacer->replaceParentPackage($package, null); + $this->replacer->replaceParentPackage($package, null, $namespacesToSkip); } return 0; @@ -75,10 +76,10 @@ protected function movePackages($packages) * @param $config * @param array $packages */ - protected function replacePackages($packages) + protected function replacePackages($packages, array $namespacesToSkip) { foreach ($packages as $package) { - $this->replacePackage($package); + $this->replacePackage($package, $namespacesToSkip); } } @@ -99,15 +100,15 @@ public function movePackage($package) /** * Replace contents of all the packages, one by one, starting on the deepest level of dependencies. */ - public function replacePackage($package) + public function replacePackage($package, array $namespacesToSkip) { if (! empty($package->dependencies)) { foreach ($package->dependencies as $dependency) { - $this->replacePackage($dependency); + $this->replacePackage($dependency, $namespacesToSkip); } } - $this->replacer->replacePackage($package); + $this->replacer->replacePackage($package, $namespacesToSkip); } /** diff --git a/src/Replace/BaseReplacer.php b/src/Replace/BaseReplacer.php index f0d17f46..3dd875b9 100644 --- a/src/Replace/BaseReplacer.php +++ b/src/Replace/BaseReplacer.php @@ -8,9 +8,14 @@ abstract class BaseReplacer implements Replacer { /** @var Autoloader */ public $autoloader; + public $namespacesToSkip; public function setAutoloader($autoloader) { $this->autoloader = $autoloader; } + public function setNamespacesToSkip(array $namespacesToSkip) + { + $this->namespacesToSkip = $namespacesToSkip; + } } diff --git a/src/Replace/ClassmapReplacer.php b/src/Replace/ClassmapReplacer.php index fddec0a3..53362165 100644 --- a/src/Replace/ClassmapReplacer.php +++ b/src/Replace/ClassmapReplacer.php @@ -15,6 +15,13 @@ public function replace($contents) return preg_replace_callback( '/(?:[abstract]*class |interface )([a-zA-Z\_]+)(?:[ \n]*{| extends| implements)/U', function ($matches) { + // If it matches any of the namespaces to skip, then do nothing + $namespacesToSkip = $this->namespacesToSkip ?? []; + foreach ($namespacesToSkip as $namespaceToSkip) { + if (strlen($matches[1]) >= strlen($namespaceToSkip) && substr($matches[1], 0, strlen($namespaceToSkip)) == $namespaceToSkip) { + return $matches[0]; + } + } $replace = $this->classmap_prefix . $matches[1]; $this->saveReplacedClass($matches[1], $replace); return str_replace($matches[1], $replace, $matches[0]); diff --git a/src/Replace/NamespaceReplacer.php b/src/Replace/NamespaceReplacer.php index 7bdc8b5c..f3d347d1 100644 --- a/src/Replace/NamespaceReplacer.php +++ b/src/Replace/NamespaceReplacer.php @@ -13,6 +13,13 @@ public function replace($contents) return preg_replace_callback( '/([^\\?])(' . addslashes($searchNamespace) . '[\\\|;])/U', function ($matches) { + // If it matches any of the namespaces to skip, then do nothing + $namespacesToSkip = $this->namespacesToSkip ?? []; + foreach ($namespacesToSkip as $namespaceToSkip) { + if (strlen($matches[2]) >= strlen($namespaceToSkip) && substr($matches[2], 0, strlen($namespaceToSkip)) == $namespaceToSkip) { + return $matches[1] . $matches[2]; + } + } return $matches[1] . $this->dep_namespace . $matches[2]; }, $contents diff --git a/src/Replace/Replacer.php b/src/Replace/Replacer.php index c803ff65..f3c5f757 100644 --- a/src/Replace/Replacer.php +++ b/src/Replace/Replacer.php @@ -5,5 +5,6 @@ interface Replacer { public function setAutoloader($autoloader); + public function setNamespacesToSkip(array $namespacesToSkip); public function replace($contents); } diff --git a/src/Replacer.php b/src/Replacer.php index 3f8d8470..0a18d49b 100644 --- a/src/Replacer.php +++ b/src/Replacer.php @@ -37,10 +37,10 @@ public function __construct($workingDir, $config) $this->filesystem = new Filesystem(new Local($this->workingDir)); } - public function replacePackage(Package $package) + public function replacePackage(Package $package, array $namespacesToSkip) { foreach ($package->autoloaders as $autoloader) { - $this->replacePackageByAutoloader($package, $autoloader); + $this->replacePackageByAutoloader($package, $autoloader, $namespacesToSkip); } } @@ -48,7 +48,7 @@ public function replacePackage(Package $package) * @param $targetFile * @param $autoloader */ - public function replaceInFile($targetFile, $autoloader) + public function replaceInFile($targetFile, $autoloader, array $namespacesToSkip) { $targetFile = str_replace($this->workingDir, '', $targetFile); $contents = $this->filesystem->read($targetFile); @@ -62,6 +62,7 @@ public function replaceInFile($targetFile, $autoloader) } $replacer->setAutoloader($autoloader); + $replacer->setNamespacesToSkip($namespacesToSkip); $contents = $replacer->replace($contents); if ($replacer instanceof ClassmapReplacer) { @@ -75,11 +76,11 @@ public function replaceInFile($targetFile, $autoloader) * @param Package $package * @param $autoloader */ - public function replacePackageByAutoloader(Package $package, $autoloader) + public function replacePackageByAutoloader(Package $package, $autoloader, array $namespacesToSkip) { if ($autoloader instanceof NamespaceAutoloader) { $source_path = $this->workingDir . $this->targetDir . str_replace('\\', '/', $autoloader->namespace) . '/'; - $this->replaceInDirectory($autoloader, $source_path); + $this->replaceInDirectory($autoloader, $namespacesToSkip, $source_path); } elseif ($autoloader instanceof Classmap) { $finder = new Finder(); $source_path = $this->workingDir . $this->config->classmap_directory . '/' . $package->config->name; @@ -89,7 +90,7 @@ public function replacePackageByAutoloader(Package $package, $autoloader) $targetFile = $foundFile->getRealPath(); if ('.php' == substr($targetFile, '-4', 4)) { - $this->replaceInFile($targetFile, $autoloader); + $this->replaceInFile($targetFile, $autoloader, $namespacesToSkip); } } } @@ -126,7 +127,7 @@ public function replaceParentClassesInDirectory($directory) * @param $autoloader * @param $directory */ - public function replaceInDirectory($autoloader, $directory) + public function replaceInDirectory($autoloader, array $namespacesToSkip, $directory) { $finder = new Finder(); $finder->files()->in($directory); @@ -135,12 +136,12 @@ public function replaceInDirectory($autoloader, $directory) $targetFile = $file->getPathName(); if ('.php' == substr($targetFile, '-4', 4)) { - $this->replaceInFile($targetFile, $autoloader); + $this->replaceInFile($targetFile, $autoloader, $namespacesToSkip); } } } - public function replaceParentPackage(Package $package, $parent) + public function replaceParentPackage(Package $package, $parent, array $namespacesToSkip) { if ($parent !== null) { // Replace everything in parent, based on the dependencies @@ -151,7 +152,7 @@ public function replaceParentPackage(Package $package, $parent) $directory = $this->workingDir . $this->config->dep_directory . $namespace . '/'; if ($autoloader instanceof NamespaceAutoloader) { - $this->replaceInDirectory($autoloader, $directory); + $this->replaceInDirectory($autoloader, $namespacesToSkip, $directory); } else { $directory = str_replace($this->workingDir, '', $directory); $this->replaceParentClassesInDirectory($directory); @@ -160,7 +161,7 @@ public function replaceParentPackage(Package $package, $parent) $directory = $this->workingDir . $this->config->classmap_directory . $parent->config->name; if ($autoloader instanceof NamespaceAutoloader) { - $this->replaceInDirectory($autoloader, $directory); + $this->replaceInDirectory($autoloader, $namespacesToSkip, $directory); } else { $directory = str_replace($this->workingDir, '', $directory); $this->replaceParentClassesInDirectory($directory); @@ -172,7 +173,7 @@ public function replaceParentPackage(Package $package, $parent) if (! empty($package->dependencies)) { foreach ($package->dependencies as $dependency) { - $this->replaceParentPackage($dependency, $package); + $this->replaceParentPackage($dependency, $package, $namespacesToSkip); } } } diff --git a/tests/replacers/NamespaceReplacerTest.php b/tests/replacers/NamespaceReplacerTest.php index 0cf3813e..12a440b1 100644 --- a/tests/replacers/NamespaceReplacerTest.php +++ b/tests/replacers/NamespaceReplacerTest.php @@ -17,6 +17,7 @@ protected function setUp(): void $replacer = new NamespaceReplacer(); $replacer->setAutoloader($autoloader); + $replacer->setNamespacesToSkip([]); $replacer->dep_namespace = 'Prefix\\'; $this->replacer = $replacer; } @@ -39,6 +40,7 @@ public function it_doesnt_replaces_namespace_inside_namespace(): void $replacer = new NamespaceReplacer(); $replacer->setAutoloader($autoloader); + $replacer->setNamespacesToSkip([]); $replacer->dep_namespace = 'Prefix\\'; $this->replacer = $replacer;