From 9c6380da4aa3319ec4d380e3f9ee206ff82ba02a Mon Sep 17 00:00:00 2001 From: "Barry vd. Heuvel" Date: Mon, 30 Dec 2024 12:42:35 +0100 Subject: [PATCH] Remove php parser (#1644) * Remove php parser * composer fix-style --------- Co-authored-by: laravel-ide-helper --- composer.json | 3 +- src/Alias.php | 3 +- src/Generator.php | 37 ++++------- src/UsesResolver.php | 124 ------------------------------------- tests/UsesResolverTest.php | 56 ----------------- 5 files changed, 16 insertions(+), 207 deletions(-) delete mode 100644 src/UsesResolver.php delete mode 100644 tests/UsesResolverTest.php diff --git a/composer.json b/composer.json index edd6ef7..b71e4f9 100644 --- a/composer.json +++ b/composer.json @@ -27,8 +27,7 @@ "illuminate/console": "^11.15", "illuminate/database": "^11.15", "illuminate/filesystem": "^11.15", - "illuminate/support": "^11.15", - "nikic/php-parser": "^4.18 || ^5" + "illuminate/support": "^11.15" }, "require-dev": { "ext-pdo_sqlite": "*", diff --git a/src/Alias.php b/src/Alias.php index a1a474e..599b396 100644 --- a/src/Alias.php +++ b/src/Alias.php @@ -13,6 +13,7 @@ namespace Barryvdh\LaravelIdeHelper; use Barryvdh\Reflection\DocBlock; use Barryvdh\Reflection\DocBlock\Context; +use Barryvdh\Reflection\DocBlock\ContextFactory; use Barryvdh\Reflection\DocBlock\Serializer as DocBlockSerializer; use Barryvdh\Reflection\DocBlock\Tag\MethodTag; use Closure; @@ -82,7 +83,7 @@ class Alias if (!empty($this->namespace)) { try { - $this->classAliases = (new UsesResolver())->loadFromClass($this->root); + $this->classAliases = (new ContextFactory())->createFromReflector(new ReflectionClass($this->root))->getNamespaceAliases(); } catch (Throwable $e) { $this->classAliases = []; } diff --git a/src/Generator.php b/src/Generator.php index 5bbd27e..0c36850 100644 --- a/src/Generator.php +++ b/src/Generator.php @@ -17,10 +17,6 @@ use Illuminate\Support\Collection; use Illuminate\Support\Facades\Facade; use Illuminate\Support\Str; use Illuminate\Support\Traits\Macroable; -use PhpParser\Lexer\Emulative; -use PhpParser\Node\Stmt\Class_; -use PhpParser\Node\Stmt\Namespace_; -use PhpParser\Parser\Php7; use ReflectionClass; use Symfony\Component\Console\Output\OutputInterface; @@ -213,8 +209,10 @@ class Generator foreach ($realTimeFacadeFiles as $file) { try { $name = $this->getFullyQualifiedClassNameInFile($file); - $facades[$name] = $name; - } catch (\Exception $e) { + if ($name) { + $facades[$name] = $name; + } + } catch (\Throwable $e) { continue; } } @@ -226,26 +224,17 @@ class Generator { $contents = file_get_contents($path); - $parsers = new Php7(new Emulative()); + // Match namespace + preg_match('/namespace\s+([^;]+);/', $contents, $namespaceMatch); + $namespace = isset($namespaceMatch[1]) ? $namespaceMatch[1] : ''; - $parsed = collect($parsers->parse($contents) ?: []); + // Match class name + preg_match('/class\s+([a-zA-Z0-9_]+)/', $contents, $classMatch); + $className = isset($classMatch[1]) ? $classMatch[1] : ''; - $namespace = $parsed->first(function ($node) { - return $node instanceof Namespace_; - }); - - if ($namespace) { - $name = $namespace->name->toString(); - - $class = collect($namespace->stmts)->first(function ($node) { - return $node instanceof Class_; - }); - - if ($class) { - $name .= '\\' . $class->name->toString(); - } - - return $name; + // Combine namespace and class name + if ($namespace && $className) { + return $namespace . '\\' . $className; } } diff --git a/src/UsesResolver.php b/src/UsesResolver.php deleted file mode 100644 index 4900a12..0000000 --- a/src/UsesResolver.php +++ /dev/null @@ -1,124 +0,0 @@ - - * @copyright 2014 Barry vd. Heuvel / Fruitcake Studio (http://www.fruitcakestudio.nl) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link https://github.com/barryvdh/laravel-ide-helper - */ - -namespace Barryvdh\LaravelIdeHelper; - -use PhpParser\Node\Stmt\GroupUse; -use PhpParser\Node\Stmt\Namespace_; -use PhpParser\Node\Stmt\Use_; -use PhpParser\Node\Stmt\UseUse; -use PhpParser\ParserFactory; - -class UsesResolver -{ - /** - * @param string $classFQN - * @return array - */ - public function loadFromClass(string $classFQN): array - { - return $this->loadFromFile( - $classFQN, - (new \ReflectionClass($classFQN))->getFileName() - ); - } - - /** - * @param string $classFQN - * @param string $filename - * @return array - */ - public function loadFromFile(string $classFQN, string $filename): array - { - return $this->loadFromCode( - $classFQN, - file_get_contents( - $filename - ) - ); - } - - /** - * @param string $classFQN - * @param string $code - * @return array - */ - public function loadFromCode(string $classFQN, string $code): array - { - $classFQN = ltrim($classFQN, '\\'); - - $namespace = rtrim( - preg_replace( - '/([^\\\\]+)$/', - '', - $classFQN - ), - '\\' - ); - - $parser = (new ParserFactory())->createForHostVersion(); - $namespaceData = null; - - foreach ($parser->parse($code) as $node) { - if ($node instanceof Namespace_ && $node->name->toCodeString() === $namespace) { - $namespaceData = $node; - break; - } - } - - if ($namespaceData === null) { - return []; - } - - /** @var Namespace_ $namespaceData */ - - $aliases = []; - - foreach ($namespaceData->stmts as $stmt) { - if ($stmt instanceof Use_) { - if ($stmt->type !== Use_::TYPE_NORMAL) { - continue; - } - - foreach ($stmt->uses as $use) { - /** @var UseUse $use */ - - $alias = $use->alias ? - $use->alias->name : - self::classBasename($use->name->toCodeString()); - - $aliases[$alias] = '\\' . $use->name->toCodeString(); - } - } elseif ($stmt instanceof GroupUse) { - foreach ($stmt->uses as $use) { - /** @var UseUse $use */ - - $alias = $use->alias ? - $use->alias->name : - self::classBasename($use->name->toCodeString()); - - $aliases[$alias] = '\\' . $stmt->prefix->toCodeString() . '\\' . $use->name->toCodeString(); - } - } - } - - return $aliases; - } - - /** - * @param string $classFQN - * @return string - */ - protected static function classBasename(string $classFQN): string - { - return preg_replace('/^.*\\\\([^\\\\]+)$/', '$1', $classFQN); - } -} diff --git a/tests/UsesResolverTest.php b/tests/UsesResolverTest.php deleted file mode 100644 index 3f6757c..0000000 --- a/tests/UsesResolverTest.php +++ /dev/null @@ -1,56 +0,0 @@ -assertEquals( - $usesResolver->loadFromCode('Barryvdh\\LaravelIdeHelper\\Tests\\UsesResolverTest', $code), - [ - 'MyUsesResolver' => '\\Barryvdh\\LaravelIdeHelper\\UsesResolver', - 'TestCase' => '\\PHPUnit\Framework\TestCase', - ] - ); - } - - /** - * Test that we can correctly load uses from a class - */ - public function testLoadFromClass() - { - $usesResolver = new UsesResolver(); - - $this->assertEquals( - $usesResolver->loadFromClass(self::class), - [ - 'UsesResolver' => '\\Barryvdh\\LaravelIdeHelper\\UsesResolver', - 'TestCase' => '\\PHPUnit\Framework\TestCase', - ] - ); - } -}