From 99f8a83efc090c60d51c674bbf45e8f6533a6239 Mon Sep 17 00:00:00 2001 From: Alexander Schranz Date: Fri, 25 Nov 2022 01:33:26 +0100 Subject: [PATCH 1/6] Add some test cases for basic comment support --- .../Fixture/normal/comments_packages.yaml | 22 +++++++++++++++++++ .../Fixture/normal/comments_parameters.yaml | 17 ++++++++++++++ .../Fixture/normal/comments_services.yaml | 19 ++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 packages/config-transformer/tests/Converter/ConfigFormatConverter/YamlToPhp/Fixture/normal/comments_packages.yaml create mode 100644 packages/config-transformer/tests/Converter/ConfigFormatConverter/YamlToPhp/Fixture/normal/comments_parameters.yaml create mode 100644 packages/config-transformer/tests/Converter/ConfigFormatConverter/YamlToPhp/Fixture/normal/comments_services.yaml diff --git a/packages/config-transformer/tests/Converter/ConfigFormatConverter/YamlToPhp/Fixture/normal/comments_packages.yaml b/packages/config-transformer/tests/Converter/ConfigFormatConverter/YamlToPhp/Fixture/normal/comments_packages.yaml new file mode 100644 index 0000000000..a071c8951d --- /dev/null +++ b/packages/config-transformer/tests/Converter/ConfigFormatConverter/YamlToPhp/Fixture/normal/comments_packages.yaml @@ -0,0 +1,22 @@ +# Intro comment +security: + # Some nice comment 1 + encoders: true # inline comment + # Some nice comment 2 + other: true # inline comment +----- +extension('security', [ + // Some nice comment 1 + 'encoders' => true, // inline comment + // Some nice comment 2 + 'other' => true, // inline comment + ]); +}; diff --git a/packages/config-transformer/tests/Converter/ConfigFormatConverter/YamlToPhp/Fixture/normal/comments_parameters.yaml b/packages/config-transformer/tests/Converter/ConfigFormatConverter/YamlToPhp/Fixture/normal/comments_parameters.yaml new file mode 100644 index 0000000000..0c12f0e7b5 --- /dev/null +++ b/packages/config-transformer/tests/Converter/ConfigFormatConverter/YamlToPhp/Fixture/normal/comments_parameters.yaml @@ -0,0 +1,17 @@ +# Intro comment +parameters: + # Some nice comment + key: 'value' # inline comment +----- +parameters(); + + // Some nice comment + $parameters->set('key', 'value'); +}; diff --git a/packages/config-transformer/tests/Converter/ConfigFormatConverter/YamlToPhp/Fixture/normal/comments_services.yaml b/packages/config-transformer/tests/Converter/ConfigFormatConverter/YamlToPhp/Fixture/normal/comments_services.yaml new file mode 100644 index 0000000000..69e7edf497 --- /dev/null +++ b/packages/config-transformer/tests/Converter/ConfigFormatConverter/YamlToPhp/Fixture/normal/comments_services.yaml @@ -0,0 +1,19 @@ +# Intro comment +services: + # Some nice comment + App\Service: ~ # inline comment +----- +services(); + + // Some nice comment + $services->set(Service::class); // inline comment +}; From f513fe48e214dbf1de03dee3fb27ba0e584b57d1 Mon Sep 17 00:00:00 2001 From: Alexander Schranz Date: Fri, 25 Nov 2022 01:33:36 +0100 Subject: [PATCH 2/6] Prototype to convert comments --- packages/config-transformer/src/ConfigLoader.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/config-transformer/src/ConfigLoader.php b/packages/config-transformer/src/ConfigLoader.php index 376fc2bf1d..427919beb2 100644 --- a/packages/config-transformer/src/ConfigLoader.php +++ b/packages/config-transformer/src/ConfigLoader.php @@ -39,6 +39,12 @@ final class ConfigLoader */ private const UNQUOTED_PARAMETER_REGEX = '#(\w+:\s+)(\%(.*?)%)(.*?)?$#m'; + /** + * @see https://regex101.com/r/I2wiC9/2 + * @var string + */ + private const COMMENT_REGEX = '#^(\s+)?\# (.*)#m'; + public function __construct( private IdAwareXmlFileLoaderFactory $idAwareXmlFileLoaderFactory, private SmartFileSystem $smartFileSystem, @@ -64,6 +70,13 @@ public function createAndLoadContainerBuilderFromFileInfo( static fn (array $match): string => $match[1] . '"' . $match[2] . ($match[4] ?? '') . '"' ); + // fake comment to keep them + $content = Strings::replace( + $content, + self::COMMENT_REGEX, + static fn ($match): string => $match[1] . '"%comment(' . $match[2] . ')%": null' + ); + if (in_array($smartFileInfo->getSuffix(), [Format::YML, Format::YAML], true)) { $content = Strings::replace( $content, From f686be6df7cec23468898971eb93cb1762346dab Mon Sep 17 00:00:00 2001 From: Alexander Schranz Date: Fri, 25 Nov 2022 01:34:29 +0100 Subject: [PATCH 3/6] Fix test case --- .../YamlToPhp/Fixture/normal/comments_parameters.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/config-transformer/tests/Converter/ConfigFormatConverter/YamlToPhp/Fixture/normal/comments_parameters.yaml b/packages/config-transformer/tests/Converter/ConfigFormatConverter/YamlToPhp/Fixture/normal/comments_parameters.yaml index 0c12f0e7b5..86f87d9320 100644 --- a/packages/config-transformer/tests/Converter/ConfigFormatConverter/YamlToPhp/Fixture/normal/comments_parameters.yaml +++ b/packages/config-transformer/tests/Converter/ConfigFormatConverter/YamlToPhp/Fixture/normal/comments_parameters.yaml @@ -13,5 +13,5 @@ return static function (ContainerConfigurator $containerConfigurator): void { $parameters = $containerConfigurator->parameters(); // Some nice comment - $parameters->set('key', 'value'); + $parameters->set('key', 'value'); // inline comment }; From ffbdb01c355c8437f91c86e55043824b697db961 Mon Sep 17 00:00:00 2001 From: Alexander Schranz Date: Fri, 25 Nov 2022 01:35:55 +0100 Subject: [PATCH 4/6] Add doc comment --- ...tainerConfiguratorReturnClosureFactory.php | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/packages/php-config-printer/src/NodeFactory/ContainerConfiguratorReturnClosureFactory.php b/packages/php-config-printer/src/NodeFactory/ContainerConfiguratorReturnClosureFactory.php index 0019220aec..9a8e041d54 100644 --- a/packages/php-config-printer/src/NodeFactory/ContainerConfiguratorReturnClosureFactory.php +++ b/packages/php-config-printer/src/NodeFactory/ContainerConfiguratorReturnClosureFactory.php @@ -5,6 +5,7 @@ namespace Symplify\PhpConfigPrinter\NodeFactory; use Nette\Utils\Json; +use PhpParser\Comment\Doc; use PhpParser\Node\Arg; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; @@ -60,7 +61,10 @@ public function createFromYamlArray( */ private function createClosureStmts(array $yamlData): array { - $yamlData = array_filter($yamlData); + $yamlData = array_filter($yamlData, function($v, $k) { + return $v || str_starts_with($k, '%comment('); + }, ARRAY_FILTER_USE_BOTH); + return $this->createStmtsFromCaseConverters($yamlData); } @@ -72,10 +76,24 @@ private function createStmtsFromCaseConverters(array $yamlData): array { $stmts = []; + $lastComments = []; + $rootLastComments = []; foreach ($yamlData as $key => $values) { + if (str_starts_with($key, '%comment(')) { + $rootLastComments[] = substr($key, 9, -2); + + continue; + } + $stmts = $this->createInitializeStmt($key, $stmts); foreach ($values as $nestedKey => $nestedValues) { + if (str_starts_with($nestedKey, '%comment(')) { + $lastComments[] = substr($nestedKey, 9, -2); + + continue; + } + $nestedNodes = $this->processNestedNodes($key, $nestedKey, $nestedValues); if ($nestedNodes !== []) { @@ -89,11 +107,26 @@ private function createStmtsFromCaseConverters(array $yamlData): array } $lastNode = end($stmts); + $node = $this->resolveExpressionWhenAtEnv($expression, $key, $lastNode); + if ($node !== null) { + foreach ($lastComments as $lastComment) { + $node->setDocComment(new Doc('// ' . $lastComment)); + } + $lastComment = []; + $stmts[] = $node; } } + + $firstNode = reset($stmts); + if ($firstNode) { + foreach ($rootLastComments as $lastComment) { + $firstNode->setDocComment(new Doc('// ' . $lastComment)); + } + $rootLastComments = []; + } } return $stmts; From f88145dd00556082604c7d34327bc1bd001abb9f Mon Sep 17 00:00:00 2001 From: Alexander Schranz Date: Fri, 25 Nov 2022 01:42:40 +0100 Subject: [PATCH 5/6] Add missing comment --- .../YamlToPhp/Fixture/normal/comments_parameters.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/config-transformer/tests/Converter/ConfigFormatConverter/YamlToPhp/Fixture/normal/comments_parameters.yaml b/packages/config-transformer/tests/Converter/ConfigFormatConverter/YamlToPhp/Fixture/normal/comments_parameters.yaml index 86f87d9320..576f4d4c9a 100644 --- a/packages/config-transformer/tests/Converter/ConfigFormatConverter/YamlToPhp/Fixture/normal/comments_parameters.yaml +++ b/packages/config-transformer/tests/Converter/ConfigFormatConverter/YamlToPhp/Fixture/normal/comments_parameters.yaml @@ -10,6 +10,7 @@ declare(strict_types=1); use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return static function (ContainerConfigurator $containerConfigurator): void { + // Intro comment $parameters = $containerConfigurator->parameters(); // Some nice comment From 37333face8436caa1e588c3b223169a283d94f11 Mon Sep 17 00:00:00 2001 From: Alexander Schranz Date: Fri, 25 Nov 2022 01:43:29 +0100 Subject: [PATCH 6/6] Add example of nested package config --- .../YamlToPhp/Fixture/normal/comments_packages.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/config-transformer/tests/Converter/ConfigFormatConverter/YamlToPhp/Fixture/normal/comments_packages.yaml b/packages/config-transformer/tests/Converter/ConfigFormatConverter/YamlToPhp/Fixture/normal/comments_packages.yaml index a071c8951d..957c591ea7 100644 --- a/packages/config-transformer/tests/Converter/ConfigFormatConverter/YamlToPhp/Fixture/normal/comments_packages.yaml +++ b/packages/config-transformer/tests/Converter/ConfigFormatConverter/YamlToPhp/Fixture/normal/comments_packages.yaml @@ -4,6 +4,9 @@ security: encoders: true # inline comment # Some nice comment 2 other: true # inline comment + nested: + # Nested Config + key: true # inline comment ----- true, // inline comment // Some nice comment 2 'other' => true, // inline comment + 'nested' => [ + // Nested Config + 'key' => true, // inline comment + ], ]); };