Skip to content

Commit

Permalink
Multiplier generics
Browse files Browse the repository at this point in the history
  • Loading branch information
MartinMystikJonas authored and ondrejmirtes committed Apr 11, 2023
1 parent 0340705 commit 23eac57
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 0 deletions.
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
"nette/utils": "<2.3.0"
},
"require-dev": {
"nette/application": "^3.0",
"nette/forms": "^3.0",
"nette/utils": "^2.3.0 || ^3.0.0",
"nikic/php-parser": "^4.13.2",
Expand Down
4 changes: 4 additions & 0 deletions extension.neon
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ parameters:
stubFiles:
- stubs/Application/Routers/RouteList.stub
- stubs/Application/UI/Component.stub
- stubs/Application/UI/Multiplier.stub
- stubs/ComponentModel/Component.stub
- stubs/ComponentModel/Container.stub
- stubs/ComponentModel/IComponent.stub
Expand All @@ -31,6 +32,9 @@ parameters:
- Nette\Http\SessionSection
- Nette\Security\Identity
- Nette\Security\SimpleIdentity
featureToggles:
skipCheckGenericClasses:
- Nette\Application\UI\Multiplier
earlyTerminatingMethodCalls:
Nette\Application\UI\Component:
- error
Expand Down
19 changes: 19 additions & 0 deletions stubs/Application/UI/Multiplier.stub
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

namespace Nette\Application\UI;

/**
* @template T of \Nette\ComponentModel\IComponent
*/
final class Multiplier extends Component
{
/**
* @param callable(string, self<T>) : T $factory
*/
public function __construct(callable $factory);

/**
* @return T
*/
protected function createComponent(string $name): \Nette\ComponentModel\IComponent;
}
36 changes: 36 additions & 0 deletions tests/Type/Nette/MultiplierTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php declare(strict_types = 1);

namespace PHPStan\Type\Nette;

use PHPStan\Testing\TypeInferenceTestCase;

class MultiplierTest extends TypeInferenceTestCase
{

/** @return iterable<mixed> */
public function dataFileAsserts(): iterable
{
yield from $this->gatherAssertTypes(__DIR__ . '/data/multiplier.php');
}

/**
* @dataProvider dataFileAsserts
* @param mixed ...$args
*/
public function testFileAsserts(
string $assertType,
string $file,
...$args
): void
{
$this->assertFileAsserts($assertType, $file, ...$args);
}

public static function getAdditionalConfigFiles(): array
{
return [
__DIR__ . '/../../../extension.neon',
];
}

}
17 changes: 17 additions & 0 deletions tests/Type/Nette/data/multiplier.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php declare(strict_types = 1);

use Nette\Application\UI\Form;
use Nette\Application\UI\Multiplier;

use function PHPStan\Testing\assertType;

/** @var Multiplier<Form> $multiplier */
$multiplier = new Multiplier(function (string $name): Form {
return new Form();
});

assertType('Nette\Application\UI\Multiplier<Nette\Application\UI\Form>', $multiplier);

$form = $multiplier->createComponent('foo');

assertType(Form::class, $form);

0 comments on commit 23eac57

Please sign in to comment.