Skip to content

Commit

Permalink
SDK-5377: Introduce array element to env manifeststrategy (#161)
Browse files Browse the repository at this point in the history
  • Loading branch information
VladislavStrelchenko committed Nov 28, 2023
1 parent b0d8904 commit b638757
Show file tree
Hide file tree
Showing 52 changed files with 2,028 additions and 910 deletions.
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
"ext-dom": "*",
"ext-simplexml": "*",
"ext-json": "*",
"aws/aws-sdk-php": "^3.257",
"composer-plugin-api": "^1.0.0 || ^2.0.0",
"aws/aws-sdk-php": "^3.257",
"composer/composer": "^2.1.0",
"czproject/git-php": "^4.1",
"guzzlehttp/guzzle": "^7.4",
Expand Down
4 changes: 2 additions & 2 deletions src/Builder/ClassBuilderFacade.php
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ public function resolveClass(string $targetClassName, string $customOrganisation
public function storeClass(ClassInformationTransfer $classInformationTransfer): bool
{
return $this->getFactory()
->createClassFileWriter()
->storeClass($classInformationTransfer);
->createFileWriter()
->storeFile($classInformationTransfer);
}

/**
Expand Down
2 changes: 1 addition & 1 deletion src/Builder/ClassGenerator/ClassGenerator.php
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ public function generateClass(string $className, ?string $parentClass = null): C

$syntaxTree = [$classNamespaceBuilder->getNode()];

$classInformationTransfer->setClassTokenTree($syntaxTree)
$classInformationTransfer->setTokenTree($syntaxTree)
->setFilePath(
$moduleDir
. '/src'
Expand Down
53 changes: 53 additions & 0 deletions src/Builder/ClassLoader/AbstractLoader.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
<?php

/**
* Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
* Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
*/

declare(strict_types=1);

namespace SprykerSdk\Integrator\Builder\ClassLoader;

use PhpParser\Lexer;
use PhpParser\NodeTraverser;
use PhpParser\NodeVisitor\CloningVisitor;
use PhpParser\NodeVisitor\NameResolver;
use PhpParser\Parser;

abstract class AbstractLoader
{
/**
* @var \PhpParser\Parser
*/
protected $parser;

/**
* @var \PhpParser\Lexer
*/
protected $lexer;

/**
* @param \PhpParser\Parser $parser
* @param \PhpParser\Lexer $lexer
*/
public function __construct(Parser $parser, Lexer $lexer)
{
$this->parser = $parser;
$this->lexer = $lexer;
}

/**
* @param array<\PhpParser\Node\Stmt> $originalSyntaxTree
*
* @return array<\PhpParser\Node>
*/
protected function traverseOriginalSyntaxTree(array $originalSyntaxTree): array
{
$nodeTraverser = new NodeTraverser();
$nodeTraverser->addVisitor(new NameResolver());
$nodeTraverser->addVisitor(new CloningVisitor());

return $nodeTraverser->traverse($originalSyntaxTree);
}
}
45 changes: 3 additions & 42 deletions src/Builder/ClassLoader/ClassLoader.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,44 +10,19 @@
namespace SprykerSdk\Integrator\Builder\ClassLoader;

use Composer\Autoload\ClassLoader as ComposerClassLoader;
use PhpParser\Lexer;
use PhpParser\Node;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\Namespace_;
use PhpParser\NodeFinder;
use PhpParser\NodeTraverser;
use PhpParser\NodeVisitor\CloningVisitor;
use PhpParser\NodeVisitor\NameResolver;
use PhpParser\Parser;
use SprykerSdk\Integrator\Transfer\ClassInformationTransfer;

class ClassLoader implements ClassLoaderInterface
class ClassLoader extends AbstractLoader implements ClassLoaderInterface
{
/**
* @var \Composer\Autoload\ClassLoader|null
*/
private static ?ComposerClassLoader $composerClassLoader = null;

/**
* @var \PhpParser\Parser
*/
protected $parser;

/**
* @var \PhpParser\Lexer
*/
protected $lexer;

/**
* @param \PhpParser\Parser $parser
* @param \PhpParser\Lexer $lexer
*/
public function __construct(Parser $parser, Lexer $lexer)
{
$this->parser = $parser;
$this->lexer = $lexer;
}

/**
* @param string $className
*
Expand All @@ -74,8 +49,8 @@ public function loadClass(string $className): ClassInformationTransfer
$originalSyntaxTree = $this->parser->parse($fileContents);
$syntaxTree = $originalSyntaxTree ? $this->traverseOriginalSyntaxTree($originalSyntaxTree) : [];

$classInformationTransfer->setClassTokenTree($syntaxTree)
->setOriginalClassTokenTree($originalSyntaxTree)
$classInformationTransfer->setTokenTree($syntaxTree)
->setOriginalTokenTree($originalSyntaxTree)
->setTokens($this->lexer->getTokens())
->setFilePath(realpath($fileName));

Expand Down Expand Up @@ -116,20 +91,6 @@ protected function getParent(array $originalSyntaxTree): ?string
return null;
}

/**
* @param array<\PhpParser\Node\Stmt> $originalSyntaxTree
*
* @return array<\PhpParser\Node>
*/
protected function traverseOriginalSyntaxTree(array $originalSyntaxTree): array
{
$nodeTraverser = new NodeTraverser();
$nodeTraverser->addVisitor(new CloningVisitor());
$nodeTraverser->addVisitor(new NameResolver());

return $nodeTraverser->traverse($originalSyntaxTree);
}

/**
* @param string $className
*
Expand Down
43 changes: 43 additions & 0 deletions src/Builder/ClassLoader/FileLoader.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?php

/**
* Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
* Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
*/

declare(strict_types=1);

namespace SprykerSdk\Integrator\Builder\ClassLoader;

use SprykerSdk\Integrator\Transfer\FileInformationTransfer;

class FileLoader extends AbstractLoader implements FileLoaderInterface
{
/**
* @param string $path
*
* @return \SprykerSdk\Integrator\Transfer\FileInformationTransfer
*/
public function loadFile(string $path): FileInformationTransfer
{
$fileInformationTransfer = (new FileInformationTransfer())->setFilePath($path);
if (!file_exists($path)) {
return $fileInformationTransfer;
}

$fileContents = file_get_contents($path);
if (!$fileContents) {
return $fileInformationTransfer;
}
$fileInformationTransfer->setContent($fileContents);

$originalSyntaxTree = $this->parser->parse($fileContents);
$syntaxTree = $originalSyntaxTree ? $this->traverseOriginalSyntaxTree($originalSyntaxTree) : [];

$fileInformationTransfer->setTokenTree($syntaxTree)
->setOriginalTokenTree($originalSyntaxTree)
->setTokens($this->lexer->getTokens());

return $fileInformationTransfer;
}
}
22 changes: 22 additions & 0 deletions src/Builder/ClassLoader/FileLoaderInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

/**
* Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
* Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
*/

declare(strict_types=1);

namespace SprykerSdk\Integrator\Builder\ClassLoader;

use SprykerSdk\Integrator\Transfer\FileInformationTransfer;

interface FileLoaderInterface
{
/**
* @param string $path
*
* @return \SprykerSdk\Integrator\Transfer\FileInformationTransfer
*/
public function loadFile(string $path): FileInformationTransfer;
}
4 changes: 2 additions & 2 deletions src/Builder/ClassModifier/AddVisitorsTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ protected function addVisitorsClassInformationTransfer(ClassInformationTransfer
$nodeTraverser->addVisitor($visitor);
}

$classInformationTransfer->setClassTokenTree(
$nodeTraverser->traverse($classInformationTransfer->getClassTokenTree()),
$classInformationTransfer->setTokenTree(
$nodeTraverser->traverse($classInformationTransfer->getTokenTree()),
);

return $classInformationTransfer;
Expand Down
8 changes: 4 additions & 4 deletions src/Builder/ClassModifier/CommonClass/CommonClassModifier.php
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ public function overrideMethodFromParent(ClassInformationTransfer $classInformat

$nodeTraverser = new NodeTraverser();
$nodeTraverser->addVisitor(new AddMethodVisitor($methodSyntaxTree));
$classInformationTransfer->setClassTokenTree($nodeTraverser->traverse($classInformationTransfer->getClassTokenTree()));
$classInformationTransfer->setTokenTree($nodeTraverser->traverse($classInformationTransfer->getTokenTree()));

return $classInformationTransfer;
}
Expand Down Expand Up @@ -156,7 +156,7 @@ public function replaceMethodBody(
$nodeTraverser = new NodeTraverser();
$nodeTraverser->addVisitor(new ReplaceNodePropertiesByNameVisitor($targetMethodName, $methodNodeProperties));
$classInformationTransfer
->setClassTokenTree($nodeTraverser->traverse($classInformationTransfer->getClassTokenTree()));
->setTokenTree($nodeTraverser->traverse($classInformationTransfer->getTokenTree()));

return $classInformationTransfer;
}
Expand All @@ -172,7 +172,7 @@ public function removeClassMethod(ClassInformationTransfer $classInformationTran
$nodeTraverser = new NodeTraverser();
$nodeTraverser->addVisitor(new RemoveMethodVisitor($methodNameToRemove));
$classInformationTransfer
->setClassTokenTree($nodeTraverser->traverse($classInformationTransfer->getClassTokenTree()));
->setTokenTree($nodeTraverser->traverse($classInformationTransfer->getTokenTree()));

return $classInformationTransfer;
}
Expand Down Expand Up @@ -234,7 +234,7 @@ protected function appendNonLiteralArrayValueToMethodBody(
$nodeTraverser->addVisitor(new AddStatementToStatementListVisitor($methodName, $arrayItems, $nodeComparer));

return $classInformationTransfer
->setClassTokenTree($nodeTraverser->traverse($classInformationTransfer->getClassTokenTree()));
->setTokenTree($nodeTraverser->traverse($classInformationTransfer->getTokenTree()));
}

/**
Expand Down
60 changes: 60 additions & 0 deletions src/Builder/ClassModifier/ConfigFile/ConfigFileModifier.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<?php

/**
* Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
* Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
*/

declare(strict_types=1);

namespace SprykerSdk\Integrator\Builder\ClassModifier\ConfigFile;

use PhpParser\Node;
use PhpParser\Node\Expr\ArrayItem;
use PhpParser\NodeFinder;
use PhpParser\NodeTraverser;
use SprykerSdk\Integrator\Builder\PartialParser\ExpressionPartialParserInterface;
use SprykerSdk\Integrator\Builder\Visitor\AddArrayItemToEnvConfigVisitor;
use SprykerSdk\Integrator\Transfer\FileInformationTransfer;

class ConfigFileModifier implements ConfigFileModifierInterface
{
protected ExpressionPartialParserInterface $expressionPartialParser;

/**
* @param \SprykerSdk\Integrator\Builder\PartialParser\ExpressionPartialParserInterface $expressionPartialParser
*/
public function __construct(ExpressionPartialParserInterface $expressionPartialParser)
{
$this->expressionPartialParser = $expressionPartialParser;
}

/**
* @param \SprykerSdk\Integrator\Transfer\FileInformationTransfer $fileInformationTransfer
* @param string $target
* @param string $value
*
* @return \SprykerSdk\Integrator\Transfer\FileInformationTransfer
*/
public function addArrayItemToEnvConfig(
FileInformationTransfer $fileInformationTransfer,
string $target,
string $value
): FileInformationTransfer {
$valueStm = $this->expressionPartialParser->parse(sprintf('$var = %s;', $value));

/** @var \PhpParser\Node\Expr\ArrayItem|null $arrayItem */
$arrayItem = (new NodeFinder())->findFirst($valueStm, function (Node $node) {
return $node instanceof ArrayItem;
});
if (!$arrayItem) {
return $fileInformationTransfer;
}

$nodeTraverser = new NodeTraverser();
$nodeTraverser->addVisitor(new AddArrayItemToEnvConfigVisitor($target, $arrayItem));

return $fileInformationTransfer
->setTokenTree($nodeTraverser->traverse($fileInformationTransfer->getTokenTree()));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

/**
* Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
* Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
*/

declare(strict_types=1);

namespace SprykerSdk\Integrator\Builder\ClassModifier\ConfigFile;

use SprykerSdk\Integrator\Transfer\FileInformationTransfer;

interface ConfigFileModifierInterface
{
/**
* @param \SprykerSdk\Integrator\Transfer\FileInformationTransfer $fileInformationTransfer
* @param string $target
* @param string $value
*
* @return \SprykerSdk\Integrator\Transfer\FileInformationTransfer
*/
public function addArrayItemToEnvConfig(FileInformationTransfer $fileInformationTransfer, string $target, string $value): FileInformationTransfer;
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public function unwire(

[$keyClass, $keyConst] = explode('::', $key);
$this->nodeTraverser->addVisitor(new RemoveGlueRelationshipFromClassListVisitor($targetMethodName, $keyClass, $keyConst, $classNameToRemove));
$classInformationTransfer->setClassTokenTree($this->nodeTraverser->traverse($classInformationTransfer->getClassTokenTree()));
$classInformationTransfer->setTokenTree($this->nodeTraverser->traverse($classInformationTransfer->getTokenTree()));

return $classInformationTransfer;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public function wire(
$methodBody = $this->getMethodBody($methodNode, $classNameToAdd, $keyClass, $keyConst);

$this->nodeTraverser->addVisitor(new MethodBodyExtendVisitor($targetMethodName, $methodBody));
$classInformationTransfer->setClassTokenTree($this->nodeTraverser->traverse($classInformationTransfer->getClassTokenTree()));
$classInformationTransfer->setTokenTree($this->nodeTraverser->traverse($classInformationTransfer->getTokenTree()));

return $classInformationTransfer;
}
Expand Down
Loading

0 comments on commit b638757

Please sign in to comment.