From 22e7f22c39327a0849f2762fbba34bf7e6dbed8f Mon Sep 17 00:00:00 2001 From: Andreas Gohr Date: Tue, 8 Aug 2023 08:40:27 +0200 Subject: [PATCH] Automatically use the right class for deprecated ones --- Heuristics.php | 54 +++++++++++++++++++++++++++++++++++++++- _test/HeuristicsTest.php | 12 +++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/Heuristics.php b/Heuristics.php index addfafb..f6795ce 100644 --- a/Heuristics.php +++ b/Heuristics.php @@ -12,6 +12,8 @@ class Heuristics protected $def = ''; /** @var string the path to use */ protected $path = ''; + /** @var array deprecated classes and their replacements */ + protected $deprecations; /** * Try to gues what the given reference means and how to best search for it @@ -20,6 +22,9 @@ class Heuristics */ public function __construct($reference) { + $this->loadDeprecations(); + + if ($reference !== '') $reference = $this->checkDeprecation($reference); if ($reference !== '') $reference = $this->checkHash($reference); if ($reference !== '') $reference = $this->checkFilename($reference); if ($reference !== '') $reference = $this->checkNamespace($reference); @@ -46,6 +51,28 @@ public function getPath() return trim(preg_replace('/[^\w.]+/', ' ', $this->path)); } + /** + * @return array + */ + public function getDeprecations() + { + return $this->deprecations; + } + + /** + * Replace deprecated classes + * + * @param string $reference + * @return string + */ + protected function checkDeprecation($reference) + { + if (isset($this->deprecations[$reference])) { + return $this->deprecations[$reference]; + } + return $reference; + } + /** * Handle things in the form path#symbol * @@ -86,7 +113,7 @@ protected function checkNamespace($reference) if (strpos($reference, '\\') === false) return $reference; $parts = explode('\\', $reference); - $parts = array_filter($parts); + $parts = array_values(array_filter($parts)); $reference = array_pop($parts); // last part may be more than a class // our classes are in inc @@ -166,4 +193,29 @@ protected function checkPSRClass($reference) } return $reference; } + + /** + * Load deprecated classes info + */ + protected function loadDeprecations() + { + $this->deprecations = []; + + // class aliases + $legacy = file_get_contents(DOKU_INC . 'inc/legacy.php'); + if (preg_match_all('/class_alias\(\'([^\']+)\', *\'([^\']+)\'\)/', $legacy, $matches, PREG_SET_ORDER)) { + foreach ($matches as $match) { + $this->deprecations[$match[2]] = $match[1]; + } + } + + // deprecated classes + $deprecations = file_get_contents(DOKU_INC . 'inc/deprecated.php'); + if (preg_match_all('/class (.+?) extends (\\\\dokuwiki\\\\.+?)(\s|$|{)/', $deprecations, $matches, PREG_SET_ORDER)) { + foreach ($matches as $match) { + $this->deprecations[$match[1]] = $match[2]; + } + } + } + } diff --git a/_test/HeuristicsTest.php b/_test/HeuristicsTest.php index 87a6def..9c746b5 100644 --- a/_test/HeuristicsTest.php +++ b/_test/HeuristicsTest.php @@ -36,6 +36,7 @@ public function provideData() ['FooBar($test, $more)', 'FooBar', ''], ['AbstractItem', 'AbstractItem', 'AbstractItem'], ['abstractItem', 'abstractItem', ''], + ['Doku_Event', 'Event', 'inc Extension Event' ], ]; } @@ -52,4 +53,15 @@ public function testHeuristics($reference, $expDef, $expPath) $this->assertEquals($expDef, $heur->getDef(), 'definition is wrong'); $this->assertEquals($expPath, $heur->getPath(), 'path is wrong'); } + + public function testDeprecations() { + $heur = new Heuristics('foo'); + $deprecations = $heur->getDeprecations(); + + $this->assertArrayHasKey('Doku_Event', $deprecations); + $this->assertEquals('\dokuwiki\Extension\Event', $deprecations['Doku_Event']); + + $this->assertArrayHasKey('RemoteException', $deprecations); + $this->assertEquals('\dokuwiki\Remote\RemoteException', $deprecations['RemoteException']); + } }