Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions phpstan.neon
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,13 @@ parameters:
paths:
- 'src/TwigExtra/src'
- 'src/TwigHooks/src'

ignoreErrors:
# Symfony Config component relies on magic methods in NodeBuilder.
# PHPStan struggles to resolve these methods on the builder class when complex generics are involved,
# resulting in false positive "unknown class" errors.
-
message: '#Call to method \w+Node\(\) on an unknown class .*NodeBuilder.*#'
paths:
- 'src/TwigHooks/src/DependencyInjection/Configuration.php'
- 'src/TwigExtra/src/Symfony/DependencyInjection/Configuration.php'
11 changes: 11 additions & 0 deletions src/TwigExtra/src/Symfony/DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,23 +14,34 @@
namespace Sylius\TwigExtra\Symfony\DependencyInjection;

use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
use Symfony\Component\Config\Definition\Builder\NodeParentInterface;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

final class Configuration implements ConfigurationInterface
{
/**
* @phpstan-return TreeBuilder<'array'>
*/
public function getConfigTreeBuilder(): TreeBuilder

Check failure on line 26 in src/TwigExtra/src/Symfony/DependencyInjection/Configuration.php

View workflow job for this annotation

GitHub Actions / PHP 8.3 / Symfony ^6.4

PHPDoc tag @return contains generic type Symfony\Component\Config\Definition\Builder\TreeBuilder<string> but class Symfony\Component\Config\Definition\Builder\TreeBuilder is not generic.

Check failure on line 26 in src/TwigExtra/src/Symfony/DependencyInjection/Configuration.php

View workflow job for this annotation

GitHub Actions / PHP 8.2 / Symfony ^6.4

PHPDoc tag @return contains generic type Symfony\Component\Config\Definition\Builder\TreeBuilder<string> but class Symfony\Component\Config\Definition\Builder\TreeBuilder is not generic.
{
$treeBuilder = new TreeBuilder('sylius_twig_extra');

/**
* @var ArrayNodeDefinition $rootNode
* @phpstan-var ArrayNodeDefinition<NodeParentInterface|null> $rootNode
*/
$rootNode = $treeBuilder->getRootNode();

Check failure on line 34 in src/TwigExtra/src/Symfony/DependencyInjection/Configuration.php

View workflow job for this annotation

GitHub Actions / PHP 8.3 / Symfony ^6.4

PHPDoc tag @var for variable $rootNode contains generic type Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition<Symfony\Component\Config\Definition\Builder\NodeParentInterface|null> but class Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition is not generic.

Check failure on line 34 in src/TwigExtra/src/Symfony/DependencyInjection/Configuration.php

View workflow job for this annotation

GitHub Actions / PHP 8.2 / Symfony ^6.4

PHPDoc tag @var for variable $rootNode contains generic type Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition<Symfony\Component\Config\Definition\Builder\NodeParentInterface|null> but class Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition is not generic.

$this->addTwigUxConfiguration($rootNode);

return $treeBuilder;
}

/**
* @phpstan-param ArrayNodeDefinition<NodeParentInterface|null> $rootNode
*/
private function addTwigUxConfiguration(ArrayNodeDefinition $rootNode): void

Check failure on line 44 in src/TwigExtra/src/Symfony/DependencyInjection/Configuration.php

View workflow job for this annotation

GitHub Actions / PHP 8.3 / Symfony ^6.4

PHPDoc tag @param for parameter $rootNode contains generic type Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition<Symfony\Component\Config\Definition\Builder\NodeParentInterface|null> but class Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition is not generic.

Check failure on line 44 in src/TwigExtra/src/Symfony/DependencyInjection/Configuration.php

View workflow job for this annotation

GitHub Actions / PHP 8.2 / Symfony ^6.4

PHPDoc tag @param for parameter $rootNode contains generic type Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition<Symfony\Component\Config\Definition\Builder\NodeParentInterface|null> but class Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition is not generic.
{
$rootNode
->children()
Expand Down
29 changes: 29 additions & 0 deletions src/TwigHooks/src/DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,24 @@
use Sylius\TwigHooks\Hookable\HookableComponent;
use Sylius\TwigHooks\Hookable\HookableTemplate;
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
use Symfony\Component\Config\Definition\Builder\NodeParentInterface;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

final class Configuration implements ConfigurationInterface
{
/**
* @phpstan-return TreeBuilder<'array'>
*/
public function getConfigTreeBuilder(): TreeBuilder

Check failure on line 29 in src/TwigHooks/src/DependencyInjection/Configuration.php

View workflow job for this annotation

GitHub Actions / PHP 8.3 / Symfony ^6.4

PHPDoc tag @return contains generic type Symfony\Component\Config\Definition\Builder\TreeBuilder<string> but class Symfony\Component\Config\Definition\Builder\TreeBuilder is not generic.

Check failure on line 29 in src/TwigHooks/src/DependencyInjection/Configuration.php

View workflow job for this annotation

GitHub Actions / PHP 8.2 / Symfony ^6.4

PHPDoc tag @return contains generic type Symfony\Component\Config\Definition\Builder\TreeBuilder<string> but class Symfony\Component\Config\Definition\Builder\TreeBuilder is not generic.
{
$treeBuilder = new TreeBuilder('sylius_twig_hooks');

/**
* @var ArrayNodeDefinition $rootNode
* @phpstan-var ArrayNodeDefinition<NodeParentInterface|null> $rootNode
*/
$rootNode = $treeBuilder->getRootNode();

Check failure on line 37 in src/TwigHooks/src/DependencyInjection/Configuration.php

View workflow job for this annotation

GitHub Actions / PHP 8.3 / Symfony ^6.4

PHPDoc tag @var for variable $rootNode contains generic type Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition<Symfony\Component\Config\Definition\Builder\NodeParentInterface|null> but class Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition is not generic.

Check failure on line 37 in src/TwigHooks/src/DependencyInjection/Configuration.php

View workflow job for this annotation

GitHub Actions / PHP 8.2 / Symfony ^6.4

PHPDoc tag @var for variable $rootNode contains generic type Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition<Symfony\Component\Config\Definition\Builder\NodeParentInterface|null> but class Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition is not generic.

$rootNode
->children()
Expand All @@ -41,7 +49,10 @@
return $treeBuilder;
}

/**
* @phpstan-param ArrayNodeDefinition<NodeParentInterface|null> $rootNode
*/
private function addSupportedHookableTypesConfiguration(ArrayNodeDefinition $rootNode): void

Check failure on line 55 in src/TwigHooks/src/DependencyInjection/Configuration.php

View workflow job for this annotation

GitHub Actions / PHP 8.3 / Symfony ^6.4

PHPDoc tag @param for parameter $rootNode contains generic type Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition<Symfony\Component\Config\Definition\Builder\NodeParentInterface|null> but class Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition is not generic.

Check failure on line 55 in src/TwigHooks/src/DependencyInjection/Configuration.php

View workflow job for this annotation

GitHub Actions / PHP 8.2 / Symfony ^6.4

PHPDoc tag @param for parameter $rootNode contains generic type Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition<Symfony\Component\Config\Definition\Builder\NodeParentInterface|null> but class Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition is not generic.
{
$rootNode
->children()
Expand All @@ -58,7 +69,10 @@
;
}

/**
* @phpstan-param ArrayNodeDefinition<NodeParentInterface|null> $rootNode
*/
private function addHooksConfiguration(ArrayNodeDefinition $rootNode): void

Check failure on line 75 in src/TwigHooks/src/DependencyInjection/Configuration.php

View workflow job for this annotation

GitHub Actions / PHP 8.3 / Symfony ^6.4

PHPDoc tag @param for parameter $rootNode contains generic type Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition<Symfony\Component\Config\Definition\Builder\NodeParentInterface|null> but class Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition is not generic.

Check failure on line 75 in src/TwigHooks/src/DependencyInjection/Configuration.php

View workflow job for this annotation

GitHub Actions / PHP 8.2 / Symfony ^6.4

PHPDoc tag @param for parameter $rootNode contains generic type Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition<Symfony\Component\Config\Definition\Builder\NodeParentInterface|null> but class Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition is not generic.
{
$rootNode
->children()
Expand All @@ -69,6 +83,7 @@
->arrayPrototype()
->beforeNormalization()
->always(function ($v) {
$isTypeDefined = isset($v['type']);
$isComponentDefined = isset($v['component']);
$isTemplateDefined = isset($v['template']);
$isDisabled = isset($v['enabled']) && $v['enabled'] === false;
Expand All @@ -77,6 +92,10 @@
return $v;
}

if (true === $isTypeDefined && false === $isDisabled) {
return $v;
}

$v['type'] = match (true) {
$isDisabled => 'disabled',
$isComponentDefined => 'component',
Expand All @@ -89,6 +108,16 @@
->end()
->validate()
->always(static function ($v) {
$type = $v['type'] ?? null;
if ('template' === $type) {
$v['component'] = null;
$v['props'] = [];
}

if ('component' === $type) {
$v['template'] = null;
}

$component = $v['component'] ?? null;
$template = $v['template'] ?? null;
$enabled = $v['enabled'] ?? true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ public function testItThrowsExceptionWhenBothTemplateAndComponentShortcutsAreDef
'some_hookable' => [
'component' => 'MyAwesomeComponent',
'template' => 'some_target.html.twig',
'type' => 'disabled',
],
],
],
Expand All @@ -193,6 +194,7 @@ public function testItThrowsExceptionWhenPropsAreDefinedForNonComponentHookable(
'some_hookable' => [
'template' => 'some_target.html.twig',
'props' => ['key' => 'value'],
'type' => 'disabled',
],
],
],
Expand Down
Loading