Skip to content

Commit

Permalink
Merge pull request phpDocumentor#226 from phpDocumentor/fix-resolve-a…
Browse files Browse the repository at this point in the history
…ll-fqsen-formats

Fix FQSEN resolving on see,covers,uses
  • Loading branch information
jaapio authored Sep 2, 2020
2 parents 08c0b36 + 73650dd commit 86733dc
Show file tree
Hide file tree
Showing 5 changed files with 119 additions and 4 deletions.
17 changes: 16 additions & 1 deletion src/DocBlock/Tags/Covers.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
use phpDocumentor\Reflection\Types\Context as TypeContext;
use phpDocumentor\Reflection\Utils;
use Webmozart\Assert\Assert;
use function array_key_exists;
use function explode;

/**
* Reflection class for a @covers tag in a Docblock.
Expand Down Expand Up @@ -54,11 +56,24 @@ public static function create(
$parts = Utils::pregSplit('/\s+/Su', $body, 2);

return new static(
$resolver->resolve($parts[0], $context),
self::resolveFqsen($parts[0], $resolver, $context),
$descriptionFactory->create($parts[1] ?? '', $context)
);
}

private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context) : Fqsen
{
Assert::notNull($fqsenResolver);
$fqsenParts = explode('::', $parts);
$resolved = $fqsenResolver->resolve($fqsenParts[0], $context);

if (!array_key_exists(1, $fqsenParts)) {
return $resolved;
}

return new Fqsen($resolved . '::' . $fqsenParts[1]);
}

/**
* Returns the structural element this tag refers to.
*/
Expand Down
19 changes: 17 additions & 2 deletions src/DocBlock/Tags/See.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,13 @@
use phpDocumentor\Reflection\DocBlock\Tags\Reference\Fqsen as FqsenRef;
use phpDocumentor\Reflection\DocBlock\Tags\Reference\Reference;
use phpDocumentor\Reflection\DocBlock\Tags\Reference\Url;
use phpDocumentor\Reflection\Fqsen;
use phpDocumentor\Reflection\FqsenResolver;
use phpDocumentor\Reflection\Types\Context as TypeContext;
use phpDocumentor\Reflection\Utils;
use Webmozart\Assert\Assert;
use function array_key_exists;
use function explode;
use function preg_match;

/**
Expand Down Expand Up @@ -50,7 +53,6 @@ public static function create(
?DescriptionFactory $descriptionFactory = null,
?TypeContext $context = null
) : self {
Assert::notNull($typeResolver);
Assert::notNull($descriptionFactory);

$parts = Utils::pregSplit('/\s+/Su', $body, 2);
Expand All @@ -61,7 +63,20 @@ public static function create(
return new static(new Url($parts[0]), $description);
}

return new static(new FqsenRef($typeResolver->resolve($parts[0], $context)), $description);
return new static(new FqsenRef(self::resolveFqsen($parts[0], $typeResolver, $context)), $description);
}

private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context) : Fqsen
{
Assert::notNull($fqsenResolver);
$fqsenParts = explode('::', $parts);
$resolved = $fqsenResolver->resolve($fqsenParts[0], $context);

if (!array_key_exists(1, $fqsenParts)) {
return $resolved;
}

return new Fqsen($resolved . '::' . $fqsenParts[1]);
}

/**
Expand Down
17 changes: 16 additions & 1 deletion src/DocBlock/Tags/Uses.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
use phpDocumentor\Reflection\Types\Context as TypeContext;
use phpDocumentor\Reflection\Utils;
use Webmozart\Assert\Assert;
use function array_key_exists;
use function explode;

/**
* Reflection class for a {@}uses tag in a Docblock.
Expand Down Expand Up @@ -53,11 +55,24 @@ public static function create(
$parts = Utils::pregSplit('/\s+/Su', $body, 2);

return new static(
$resolver->resolve($parts[0], $context),
self::resolveFqsen($parts[0], $resolver, $context),
$descriptionFactory->create($parts[1] ?? '', $context)
);
}

private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context) : Fqsen
{
Assert::notNull($fqsenResolver);
$fqsenParts = explode('::', $parts);
$resolved = $fqsenResolver->resolve($fqsenParts[0], $context);

if (!array_key_exists(1, $fqsenParts)) {
return $resolved;
}

return new Fqsen($resolved . '::' . $fqsenParts[1]);
}

/**
* Returns the structural element this tag refers to.
*/
Expand Down
38 changes: 38 additions & 0 deletions tests/integration/DocblockSeeTagResolvingTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

declare(strict_types=1);

namespace phpDocumentor\Reflection;

use phpDocumentor\Reflection\DocBlock\Tags\See;
use phpDocumentor\Reflection\Types\Context;
use PHPUnit\Framework\TestCase;

class DocblockSeeTagResolvingTest extends TestCase
{
public function testResolvesSeeFQSENOfInlineTags()
{
$context = new Context('\Project\Sub\Level', ['Issue2425B' => '\Project\Other\Level\Issue2425B', 'Aliased' => 'Project\Other\Level\Issue2425C']);
$docblockString = <<<DOCBLOCK
/**
* Class summary.
*
* A description containing an inline {@see Issue2425B::bar()} tag
* to a class inside of the project referenced via a use statement.
*
* And here is another inline {@see Aliased::bar()} tag to a class
* aliased via a use statement.
*/
DOCBLOCK;



$factory = DocBlockFactory::createInstance();
$docblock = $factory->create($docblockString, $context);

/** @var See $see1 */
$see1 = $docblock->getDescription()->getTags()[0];

$this->assertSame('\Project\Other\Level\Issue2425B::bar()', (string)$see1->getReference());
}
}
32 changes: 32 additions & 0 deletions tests/unit/DocBlock/Tags/SeeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,38 @@ public function testFactoryMethod() : void
$this->assertSame($description, $fixture->getDescription());
}

/**
* @uses \phpDocumentor\Reflection\DocBlock\Tags\See::<public>
* @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
* @uses \phpDocumentor\Reflection\FqsenResolver
* @uses \phpDocumentor\Reflection\DocBlock\Description
* @uses \phpDocumentor\Reflection\DocBlock\Tags\Reference\Fqsen
* @uses \phpDocumentor\Reflection\Fqsen
* @uses \phpDocumentor\Reflection\Types\Context
*
* @covers ::create
*/
public function testFactoryMethodWithNonClassFQSEN() : void
{
$descriptionFactory = m::mock(DescriptionFactory::class);
$resolver = m::mock(FqsenResolver::class);
$context = new Context('');

$fqsen = new Fqsen('\DateTime');
$description = new Description('My Description');

$descriptionFactory
->shouldReceive('create')->with('My Description', $context)->andReturn($description);
$resolver->shouldReceive('resolve')->with('DateTime', $context)->andReturn($fqsen);

$fixture = See::create('DateTime::createFromFormat() My Description', $resolver, $descriptionFactory, $context);

$this->assertSame('\DateTime::createFromFormat() My Description', (string) $fixture);
$this->assertInstanceOf(FqsenRef::class, $fixture->getReference());
$this->assertSame('\DateTime::createFromFormat()', (string) $fixture->getReference());
$this->assertSame($description, $fixture->getDescription());
}

/**
* @uses \phpDocumentor\Reflection\DocBlock\Tags\See::<public>
* @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
Expand Down

0 comments on commit 86733dc

Please sign in to comment.