Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix resolve namespace uses #2

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions src/Alias.php
Original file line number Diff line number Diff line change
Expand Up @@ -79,9 +79,7 @@ public function __construct($config, $alias, $facade, $magicMethods = [], $inter
$this->detectExtendsNamespace();

if (!empty($this->namespace)) {
$this->classAliases = (new UsesResolver())
->loadFromClass($this->root)
->getClassAliases();
$this->classAliases = (new UsesResolver())->loadFromClass($this->root);

//Create a DocBlock and serializer instance
$this->phpdoc = new DocBlock(new ReflectionClass($alias), new Context($this->namespace, $this->classAliases));
Expand Down
78 changes: 34 additions & 44 deletions src/UsesResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@

namespace Barryvdh\LaravelIdeHelper;

use Illuminate\Support\Arr;
use PhpParser\Node\Stmt\GroupUse;
use PhpParser\Node\Stmt\Namespace_;
use PhpParser\Node\Stmt\Use_;
Expand All @@ -20,24 +19,11 @@

class UsesResolver
{
/**
* @var array
*/
protected $classAliases = [];

/**
* @return array
*/
public function getClassAliases()
{
return $this->classAliases;
}

/**
* @param string $classFQN
* @return $this
* @return array
*/
public function loadFromClass(string $classFQN)
public function loadFromClass(string $classFQN): array
{
return $this->loadFromFile(
$classFQN,
Expand All @@ -48,9 +34,9 @@ public function loadFromClass(string $classFQN)
/**
* @param string $classFQN
* @param string $filename
* @return $this
* @return array
*/
public function loadFromFile(string $classFQN, string $filename)
public function loadFromFile(string $classFQN, string $filename): array
{
return $this->loadFromCode(
$classFQN,
Expand All @@ -63,9 +49,9 @@ public function loadFromFile(string $classFQN, string $filename)
/**
* @param string $classFQN
* @param string $code
* @return $this
* @return array
*/
public function loadFromCode(string $classFQN, string $code)
public function loadFromCode(string $classFQN, string $code): array
{
$classFQN = ltrim($classFQN, '\\');

Expand All @@ -79,15 +65,22 @@ public function loadFromCode(string $classFQN, string $code)
);

$parser = (new ParserFactory())->create(ParserFactory::PREFER_PHP7);
$namespaceData = null;

/** @var Namespace_ $namespaceData */
$namespaceData = Arr::first(
$parser->parse($code),
function ($node) use ($namespace) {
return $node instanceof Namespace_
&& $node->name->toCodeString() === $namespace;
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_) {
Expand All @@ -98,37 +91,34 @@ function ($node) use ($namespace) {
foreach ($stmt->uses as $use) {
/** @var UseUse $use */

$this->addClassAlias(
'\\' . $use->name->toCodeString(),
$use->alias ? $use->alias->name : null
);
$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 */

$this->addClassAlias(
'\\' . $stmt->prefix->toCodeString() . '\\' . $use->name->toCodeString(),
$use->alias ? $use->alias->name : null
);
$alias = $use->alias ?
$use->alias->name :
self::classBasename($use->name->toCodeString());

$aliases[$alias] = '\\' . $stmt->prefix->toCodeString() . '\\' . $use->name->toCodeString();
}
}
}

return $this;
return $aliases;
}

/**
* @param string $classFQN
* @param string|null $alias
* @return void
* @return string
*/
protected function addClassAlias(string $classFQN, string $alias = null)
protected static function classBasename(string $classFQN): string
{
if ($alias === null) {
$alias = class_basename($classFQN);
}

$this->classAliases[$alias] = $classFQN;
return \preg_replace('/^.*\\\\([^\\\\]+)$/', '$1', $classFQN);
}
}
26 changes: 14 additions & 12 deletions tests/UsesResolverTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,13 @@ class UsesResolverTest extends TestCase
}
DOC;

$usesResolver->loadFromCode('Barryvdh\\LaravelIdeHelper\\Tests\\UsesResolverTest', $code);

$this->assertEquals($usesResolver->getClassAliases(), [
'MyUsesResolver' => '\\Barryvdh\\LaravelIdeHelper\\UsesResolver',
'TestCase' => '\\PHPUnit\Framework\TestCase',
]);
$this->assertEquals(
$usesResolver->loadFromCode('Barryvdh\\LaravelIdeHelper\\Tests\\UsesResolverTest', $code),
[
'MyUsesResolver' => '\\Barryvdh\\LaravelIdeHelper\\UsesResolver',
'TestCase' => '\\PHPUnit\Framework\TestCase',
]
);
}

/**
Expand All @@ -44,11 +45,12 @@ public function testLoadFromClass()
{
$usesResolver = new UsesResolver();

$usesResolver->loadFromClass(self::class);

$this->assertEquals($usesResolver->getClassAliases(), [
'UsesResolver' => '\\Barryvdh\\LaravelIdeHelper\\UsesResolver',
'TestCase' => '\\PHPUnit\Framework\TestCase',
]);
$this->assertEquals(
$usesResolver->loadFromClass(self::class),
[
'UsesResolver' => '\\Barryvdh\\LaravelIdeHelper\\UsesResolver',
'TestCase' => '\\PHPUnit\Framework\TestCase',
]
);
}
}