mirror of
https://github.com/barryvdh/laravel-ide-helper.git
synced 2026-08-18 01:57:13 +00:00
Improve replacement of return type for methods from Query\Builder (#1575)
* Add return type `|static` to Query\Builder methods (#1574) * Replace return type Query\Builder with Eloquent\Builder (#1574) * Replace return type Query\Builder only for facade Eloquent (#1574) * Add special return type replacement for Macros of \Eloquent * Restrict special return type to methods from Eloquent\Builder and Query\Builder * Do not overwrite return type in normalizeReturn() with conditional call of setType() * Use generic return type for builder methods in \Eloquent * composer fix-style --------- Co-authored-by: laravel-ide-helper <[email protected]>
This commit is contained in:
co-authored by
laravel-ide-helper
parent
64588afe8b
commit
e3ec773374
+34
-14
@@ -17,8 +17,6 @@ use Barryvdh\Reflection\DocBlock\Serializer as DocBlockSerializer;
|
||||
use Barryvdh\Reflection\DocBlock\Tag;
|
||||
use Barryvdh\Reflection\DocBlock\Tag\ParamTag;
|
||||
use Barryvdh\Reflection\DocBlock\Tag\ReturnTag;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class Method
|
||||
{
|
||||
@@ -39,6 +37,7 @@ class Method
|
||||
protected $return = null;
|
||||
protected $root;
|
||||
protected $classAliases;
|
||||
protected $returnTypeNormalizers;
|
||||
|
||||
/**
|
||||
* @param \ReflectionMethod|\ReflectionFunctionAbstract $method
|
||||
@@ -47,12 +46,14 @@ class Method
|
||||
* @param string|null $methodName
|
||||
* @param array $interfaces
|
||||
* @param array $classAliases
|
||||
* @param array $returnTypeNormalizers
|
||||
*/
|
||||
public function __construct($method, $alias, $class, $methodName = null, $interfaces = [], array $classAliases = [])
|
||||
public function __construct($method, $alias, $class, $methodName = null, $interfaces = [], array $classAliases = [], array $returnTypeNormalizers = [])
|
||||
{
|
||||
$this->method = $method;
|
||||
$this->interfaces = $interfaces;
|
||||
$this->classAliases = $classAliases;
|
||||
$this->returnTypeNormalizers = $returnTypeNormalizers;
|
||||
$this->name = $methodName ?: $method->name;
|
||||
$this->real_name = $method->isClosure() ? $this->name : $method->name;
|
||||
$this->initClassDefinedProperties($method, $class);
|
||||
@@ -180,6 +181,25 @@ class Method
|
||||
return $implode ? implode(', ', $this->params) : $this->params;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param DocBlock|null $phpdoc
|
||||
* @return ReturnTag|null
|
||||
*/
|
||||
public function getReturnTag($phpdoc = null)
|
||||
{
|
||||
if ($phpdoc === null) {
|
||||
$phpdoc = $this->phpdoc;
|
||||
}
|
||||
|
||||
$returnTags = $phpdoc->getTagsByName('return');
|
||||
|
||||
if (count($returnTags) === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return reset($returnTags);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the parameters for this method including default values
|
||||
*
|
||||
@@ -248,25 +268,31 @@ class Method
|
||||
}
|
||||
|
||||
/**
|
||||
* Normalize the return tag (make full namespace, replace interfaces)
|
||||
* Normalize the return tag (make full namespace, replace interfaces, resolve $this)
|
||||
*
|
||||
* @param DocBlock $phpdoc
|
||||
*/
|
||||
protected function normalizeReturn(DocBlock $phpdoc)
|
||||
{
|
||||
//Get the return type and adjust them for better autocomplete
|
||||
$returnTags = $phpdoc->getTagsByName('return');
|
||||
$tag = $this->getReturnTag($phpdoc);
|
||||
|
||||
if (count($returnTags) === 0) {
|
||||
if ($tag === null) {
|
||||
$this->return = null;
|
||||
return;
|
||||
}
|
||||
|
||||
/** @var ReturnTag $tag */
|
||||
$tag = reset($returnTags);
|
||||
// Get the expanded type
|
||||
$returnValue = $tag->getType();
|
||||
|
||||
if (array_key_exists($returnValue, $this->returnTypeNormalizers)) {
|
||||
$returnValue = $this->returnTypeNormalizers[$returnValue];
|
||||
}
|
||||
|
||||
if ($returnValue === '$this') {
|
||||
$returnValue = $this->root;
|
||||
}
|
||||
|
||||
// Replace the interfaces
|
||||
foreach ($this->interfaces as $interface => $real) {
|
||||
$returnValue = str_replace($interface, $real, $returnValue);
|
||||
@@ -275,12 +301,6 @@ class Method
|
||||
// Set the changed content
|
||||
$tag->setContent($returnValue . ' ' . $tag->getDescription());
|
||||
$this->return = $returnValue;
|
||||
|
||||
if ($tag->getType() === '$this') {
|
||||
Str::contains($this->root, Builder::class)
|
||||
? $tag->setType($this->root . '|static')
|
||||
: $tag->setType($this->root);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user