diff --git a/src/NativePHPDoc/Definition/NativePHPDoc/NativePHPDocDefinitionProvider.php b/src/NativePHPDoc/Definition/NativePHPDoc/NativePHPDocDefinitionProvider.php index bb405bc..4919177 100644 --- a/src/NativePHPDoc/Definition/NativePHPDoc/NativePHPDocDefinitionProvider.php +++ b/src/NativePHPDoc/Definition/NativePHPDoc/NativePHPDocDefinitionProvider.php @@ -315,7 +315,13 @@ function () use ($node, $value, $temporaryContext) { Str::endsWith($node->name, '-covariant') => TemplateTypeVariance::COVARIANT, Str::endsWith($node->name, '-contravariant') => TemplateTypeVariance::CONTRAVARIANT, default => TemplateTypeVariance::INVARIANT - } + }, + default: $value->default ? + $this->phpDocTypeMapper->map( + $value->default, + $temporaryContext->value(), + ) : + null, ); } ); diff --git a/src/NativePHPDoc/Definition/TypeDefinition/TypeParameterDefinition.php b/src/NativePHPDoc/Definition/TypeDefinition/TypeParameterDefinition.php index 0aec2d2..4839e10 100644 --- a/src/NativePHPDoc/Definition/TypeDefinition/TypeParameterDefinition.php +++ b/src/NativePHPDoc/Definition/TypeDefinition/TypeParameterDefinition.php @@ -16,6 +16,7 @@ public function __construct( public readonly bool $variadic, public readonly ?Type $upperBound, public readonly TemplateTypeVariance $variance, + public readonly ?Type $default = null, ) {} public function __toString(): string @@ -28,6 +29,7 @@ public function __toString(): string }, ($this->variadic ? '...' : '') . $this->name, $this->upperBound ? "of {$this->upperBound}" : '', + $this->default ? "= {$this->default}" : '', ]; return implode(' ', array_filter($result)); diff --git a/src/Type/Template/TypeParameterMap.php b/src/Type/Template/TypeParameterMap.php index c801530..95e1e01 100644 --- a/src/Type/Template/TypeParameterMap.php +++ b/src/Type/Template/TypeParameterMap.php @@ -23,7 +23,7 @@ public function __construct( */ public static function fromArguments(array $arguments, iterable $typeParameters): self { - if (!$arguments) { + if (!$typeParameters) { return self::empty(); } @@ -37,8 +37,10 @@ public static function fromArguments(array $arguments, iterable $typeParameters) break; } - if (!$argument = $arguments[$i] ?? null) { - break; + $argument = $arguments[$i] ?? $parameter->default; + + if (!$argument) { + continue; } $map[$parameter->name] = $argument; diff --git a/tests/Integration/Reflection/ReflectionSnapshots/Tests.Stubs.Classes.DoubleTemplateType.yaml b/tests/Integration/Reflection/ReflectionSnapshots/Tests.Stubs.Classes.DoubleTemplateType.yaml index e0dd93d..6022be7 100644 --- a/tests/Integration/Reflection/ReflectionSnapshots/Tests.Stubs.Classes.DoubleTemplateType.yaml +++ b/tests/Integration/Reflection/ReflectionSnapshots/Tests.Stubs.Classes.DoubleTemplateType.yaml @@ -1,4 +1,4 @@ -type: Tests\Stubs\Classes\DoubleTemplateType +type: Tests\Stubs\Classes\DoubleTemplateType qualifiedName: Tests\Stubs\Classes\DoubleTemplateType shortName: DoubleTemplateType location: Tests\Stubs\Classes\DoubleTemplateType @@ -22,7 +22,7 @@ typeParameters: variadic: false upperBound: mixed variance: INVARIANT - asString: TTwo + asString: 'TTwo = int' extends: null implements: { } uses: @@ -30,5 +30,27 @@ uses: excludedTraitMethods: { } declaredProperties: { } properties: { } -declaredMethods: { } -methods: { } +declaredMethods: + - + asString: something() + name: something + location: 'Tests\Stubs\Classes\DoubleTemplateType::something()' + declaringType: Tests\Stubs\Classes\DoubleTemplateType + attributes: + asString: '#[]' + all: { } + typeParameters: { } + parameters: { } + returnType: int +methods: + - + asString: something() + name: something + location: 'Tests\Stubs\Classes\DoubleTemplateType::something()' + declaringType: Tests\Stubs\Classes\DoubleTemplateType + attributes: + asString: '#[]' + all: { } + typeParameters: { } + parameters: { } + returnType: int diff --git a/tests/Stubs/Classes/DoubleTemplateType.php b/tests/Stubs/Classes/DoubleTemplateType.php index 72ae49f..da7d971 100644 --- a/tests/Stubs/Classes/DoubleTemplateType.php +++ b/tests/Stubs/Classes/DoubleTemplateType.php @@ -4,8 +4,12 @@ /** * @template TOne - * @template TTwo + * @template TTwo = int */ class DoubleTemplateType { + /** + * @return TTwo + */ + public function something(): mixed {} } diff --git a/tests/Unit/Type/Definition/TypeDefinition/TypeParameterDefinitionTest.php b/tests/Unit/Type/Definition/TypeDefinition/TypeParameterDefinitionTest.php index a53009e..cc1fc6e 100644 --- a/tests/Unit/Type/Definition/TypeDefinition/TypeParameterDefinitionTest.php +++ b/tests/Unit/Type/Definition/TypeDefinition/TypeParameterDefinitionTest.php @@ -4,6 +4,7 @@ use GoodPhp\Reflection\NativePHPDoc\Definition\TypeDefinition\TypeParameterDefinition; use GoodPhp\Reflection\Type\PrimitiveType; +use GoodPhp\Reflection\Type\Special\MixedType; use GoodPhp\Reflection\Type\Template\TemplateTypeVariance; use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; @@ -93,5 +94,16 @@ public static function toStringProvider(): iterable variance: TemplateTypeVariance::COVARIANT, ), ]; + + yield [ + 'covariant T of mixed = int', + new TypeParameterDefinition( + name: 'T', + variadic: false, + upperBound: MixedType::get(), + variance: TemplateTypeVariance::COVARIANT, + default: PrimitiveType::integer(), + ), + ]; } }