mirror of
https://github.com/barryvdh/laravel-ide-helper.git
synced 2026-08-18 18:13:11 +00:00
Allow for PhpDoc for macros with union types (#1148)
* Allow for PhpDoc for macros with union types * Replace null coalescing operator * Test init PhpDoc for macros with parameter union types * Allow for PhpDoc for macros with union return types * Add helper method to Macro class * Add changelog entry * Format * Complement changelog with PR link * Add missing return * Fix test for PHP < 8 * Rewrite PHP 8 test using eval() * Remove obsolete test class * Suppress Psalm errors for undefined ReflectionUnionType class * Remove unreachable return statement
This commit is contained in:
+30
-5
@@ -42,8 +42,16 @@ class Macro extends Method
|
||||
// Add macro parameters if they are missed in original docblock
|
||||
if (!$this->phpdoc->hasTag('param')) {
|
||||
foreach ($method->getParameters() as $parameter) {
|
||||
$type = $parameter->hasType() ? $parameter->getType()->getName() : 'mixed';
|
||||
$type .= $parameter->hasType() && $parameter->getType()->allowsNull() ? '|null' : '';
|
||||
$reflectionType = $parameter->getType();
|
||||
|
||||
$type = $this->concatReflectionTypes($reflectionType);
|
||||
|
||||
/** @psalm-suppress UndefinedClass */
|
||||
if ($reflectionType && !$reflectionType instanceof \ReflectionUnionType && $reflectionType->allowsNull()) {
|
||||
$type .= '|null';
|
||||
}
|
||||
|
||||
$type = $type ?: 'mixed';
|
||||
|
||||
$name = $parameter->isVariadic() ? '...' : '';
|
||||
$name .= '$' . $parameter->getName();
|
||||
@@ -57,14 +65,31 @@ class Macro extends Method
|
||||
$builder = EloquentBuilder::class;
|
||||
$return = $method->getReturnType();
|
||||
|
||||
$type = $return->getName();
|
||||
$type .= $this->root === "\\{$builder}" && $return->getName() === $builder ? '|static' : '';
|
||||
$type .= $return->allowsNull() ? '|null' : '';
|
||||
$type = $this->concatReflectionTypes($return);
|
||||
|
||||
/** @psalm-suppress UndefinedClass */
|
||||
if (!$return instanceof \ReflectionUnionType) {
|
||||
$type .= $this->root === "\\{$builder}" && $return->getName() === $builder ? '|static' : '';
|
||||
$type .= $return->allowsNull() ? '|null' : '';
|
||||
}
|
||||
|
||||
$this->phpdoc->appendTag(Tag::createInstance("@return {$type}"));
|
||||
}
|
||||
}
|
||||
|
||||
protected function concatReflectionTypes(?\ReflectionType $type): string
|
||||
{
|
||||
/** @psalm-suppress UndefinedClass */
|
||||
$returnTypes = $type instanceof \ReflectionUnionType
|
||||
? $type->getTypes()
|
||||
: [$type];
|
||||
|
||||
return Collection::make($returnTypes)
|
||||
->filter()
|
||||
->map->getName()
|
||||
->implode('|');
|
||||
}
|
||||
|
||||
protected function addLocationToPhpDoc()
|
||||
{
|
||||
if ($this->method->name === '__invoke') {
|
||||
|
||||
Reference in New Issue
Block a user