[NamedServicesToContrutor] make tests pass

This commit is contained in:
TomasVotruba 2017-07-20 18:58:34 +02:00
parent 80314eb924
commit 09c13a11fa
9 changed files with 51 additions and 22 deletions

View File

@ -2,6 +2,7 @@
namespace Rector\Application; namespace Rector\Application;
use PhpParser\Lexer;
use PhpParser\NodeTraverser; use PhpParser\NodeTraverser;
use PhpParser\Parser; use PhpParser\Parser;
use Rector\Printer\CodeStyledPrinter; use Rector\Printer\CodeStyledPrinter;
@ -24,11 +25,17 @@ final class FileProcessor
*/ */
private $nodeTraverser; private $nodeTraverser;
public function __construct(Parser $parser, CodeStyledPrinter $codeStyledPrinter, NodeTraverser $nodeTraverser) /**
* @var Lexer
*/
private $lexer;
public function __construct(Parser $parser, CodeStyledPrinter $codeStyledPrinter, Lexer $lexer, NodeTraverser $nodeTraverser)
{ {
$this->parser = $parser; $this->parser = $parser;
$this->codeStyledPrinter = $codeStyledPrinter; $this->codeStyledPrinter = $codeStyledPrinter;
$this->nodeTraverser = $nodeTraverser; $this->nodeTraverser = $nodeTraverser;
$this->lexer = $lexer;
} }
/** /**
@ -44,18 +51,19 @@ final class FileProcessor
public function processFile(SplFileInfo $file): void public function processFile(SplFileInfo $file): void
{ {
$fileContent = file_get_contents($file->getRealPath()); $fileContent = file_get_contents($file->getRealPath());
$nodes = $this->parser->parse($fileContent); $oldStmts = $this->parser->parse($fileContent);
if ($nodes === null) { if ($oldStmts === null) {
return; return;
} }
$originalNodes = $this->cloneArrayOfObjects($nodes); $oldStmts = $this->cloneArrayOfObjects($oldStmts);
$oldTokens = $this->lexer->getTokens();
$newStmts = $this->nodeTraverser->traverse($oldStmts);
$this->nodeTraverser->traverse($nodes); $this->codeStyledPrinter->printToFile($file, $newStmts, $oldStmts, $oldTokens);
$this->codeStyledPrinter->printToFile($file, $originalNodes, $nodes);
} }
/** /**

View File

@ -1,6 +1,6 @@
<?php declare(strict_types=1); <?php declare(strict_types=1);
namespace Rector\Buillder\Class_; namespace Rector\Builder\Class_;
final class ClassPropertyCollector final class ClassPropertyCollector
{ {
@ -21,6 +21,6 @@ final class ClassPropertyCollector
*/ */
public function getPropertiesforClass(string $class): array public function getPropertiesforClass(string $class): array
{ {
return $this->classProperties[$class] ?: []; return $this->classProperties[$class] ?? [];
} }
} }

View File

@ -2,11 +2,12 @@
namespace Rector\NodeVisitor\DependencyInjection\NamedServicesToConstructor; namespace Rector\NodeVisitor\DependencyInjection\NamedServicesToConstructor;
use PhpParser\Node;
use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\Class_;
use PhpParser\NodeVisitorAbstract; use PhpParser\NodeVisitorAbstract;
use Rector\Builder\Class_\ClassPropertyCollector;
use Rector\Builder\ConstructorMethodBuilder; use Rector\Builder\ConstructorMethodBuilder;
use Rector\Builder\PropertyBuilder; use Rector\Builder\PropertyBuilder;
use Rector\Buillder\Class_\ClassPropertyCollector;
/** /**
* Add new propertis to class and to contructor. * Add new propertis to class and to contructor.
@ -43,6 +44,10 @@ final class AddPropertiesToClassNodeVisitor extends NodeVisitorAbstract
$this->newClassPropertyCollector = $newClassPropertyCollector; $this->newClassPropertyCollector = $newClassPropertyCollector;
} }
/**
* @param Node[] $nodes
* @return Node[]
*/
public function afterTraverse(array $nodes): array public function afterTraverse(array $nodes): array
{ {
foreach ($nodes as $node) { foreach ($nodes as $node) {
@ -58,7 +63,6 @@ final class AddPropertiesToClassNodeVisitor extends NodeVisitorAbstract
private function reconstruct(Class_ $classNode): void private function reconstruct(Class_ $classNode): void
{ {
$propertiesForClass = $this->newClassPropertyCollector->getPropertiesforClass($this->className); $propertiesForClass = $this->newClassPropertyCollector->getPropertiesforClass($this->className);
foreach ($propertiesForClass as $propertyType => $propertyName) { foreach ($propertiesForClass as $propertyType => $propertyName) {
$this->constructorMethodBuilder->addPropertyAssignToClass($classNode, $propertyType, $propertyName); $this->constructorMethodBuilder->addPropertyAssignToClass($classNode, $propertyType, $propertyName);
$this->propertyBuilder->addPropertyToClass($classNode, $propertyType, $propertyName); $this->propertyBuilder->addPropertyToClass($classNode, $propertyType, $propertyName);

View File

@ -11,7 +11,7 @@ use PhpParser\Node\Scalar\String_;
use PhpParser\NodeVisitorAbstract; use PhpParser\NodeVisitorAbstract;
use Rector\Builder\Kernel\ServiceFromKernelResolver; use Rector\Builder\Kernel\ServiceFromKernelResolver;
use Rector\Builder\Naming\NameResolver; use Rector\Builder\Naming\NameResolver;
use Rector\Buillder\Class_\ClassPropertyCollector; use Rector\Builder\Class_\ClassPropertyCollector;
use Rector\Tests\NodeVisitor\DependencyInjection\NamedServicesToConstructorReconstructor\Source\LocalKernel; use Rector\Tests\NodeVisitor\DependencyInjection\NamedServicesToConstructorReconstructor\Source\LocalKernel;
/** /**
@ -85,6 +85,7 @@ final class GetterToPropertyNodeVisitor extends NodeVisitorAbstract
{ {
if ($this->isCandidate($node)) { if ($this->isCandidate($node)) {
$this->reconstruct($node); $this->reconstruct($node);
return $node;
} }
return null; return null;

View File

@ -5,6 +5,10 @@ namespace Rector\Parser;
use PhpParser\Lexer; use PhpParser\Lexer;
use PhpParser\Lexer\Emulative; use PhpParser\Lexer\Emulative;
/**
* This Lexer allows Format-perserving AST Transformations
* @see https://github.com/nikic/PHP-Parser/issues/344#issuecomment-298162516
*/
final class LexerFactory final class LexerFactory
{ {
public function create(): Lexer public function create(): Lexer

View File

@ -17,18 +17,18 @@ final class CodeStyledPrinter
$this->prettyPrinter = $prettyPrinter; $this->prettyPrinter = $prettyPrinter;
} }
public function printToFile(SplFileInfo $file, array $originalNodes, array $newNodes): void public function printToFile(SplFileInfo $file, array $newStmts, array $oldStmts, array $oldTokens): void
{ {
if ($originalNodes === $newNodes) { if ($oldStmts === $newStmts) {
return; return;
} }
file_put_contents($file->getRealPath(), $this->printToString($newNodes)); file_put_contents($file->getRealPath(), $this->printToString($newStmts, $oldStmts, $oldTokens));
// @todo: run ecs with minimal set to code look nice // @todo: run ecs with minimal set to code look nice
} }
public function printToString(array $oldStmts, array $newStmts, array $oldTokens): string public function printToString(array $newStmts, array $oldStmts, array $oldTokens): string
{ {
return $this->prettyPrinter->printFormatPreserving($oldStmts, $newStmts, $oldTokens); return $this->prettyPrinter->printFormatPreserving($newStmts, $oldStmts, $oldTokens);
} }
} }

View File

@ -51,6 +51,6 @@ final class FileReconstructor
$newStmts = $this->nodeTraverser->traverse($oldStmts); $newStmts = $this->nodeTraverser->traverse($oldStmts);
return $this->codeStyledPrinter->printToString($oldStmts, $newStmts, $oldTokens); return $this->codeStyledPrinter->printToString($newStmts, $oldStmts, $oldTokens);
} }
} }

View File

@ -8,8 +8,19 @@ final class Test extends AbstractReconstructorTestCase
{ {
public function test(): void public function test(): void
{ {
$this->doTestFileMatchesExpectedContent(__DIR__ . '/wrong/wrong.php.inc', __DIR__ . '/correct/correct.php.inc'); $this->doTestFileMatchesExpectedContent(
$this->doTestFileMatchesExpectedContent(__DIR__ . '/wrong/wrong2.php.inc', __DIR__ . '/correct/correct2.php.inc'); __DIR__ . '/wrong/wrong.php.inc',
// $this->doTestFileMatchesExpectedContent(__DIR__ . '/wrong/wrong3.php.inc', __DIR__ . '/correct/correct3.php.inc'); __DIR__ . '/correct/correct.php.inc'
);
$this->doTestFileMatchesExpectedContent(
__DIR__ . '/wrong/wrong2.php.inc',
__DIR__ . '/correct/correct2.php.inc'
);
$this->doTestFileMatchesExpectedContent(
__DIR__ . '/wrong/wrong3.php.inc',
__DIR__ . '/correct/correct3.php.inc'
);
} }
} }

View File

@ -1,4 +1,5 @@
<?php declare (strict_types=1); <?php declare (strict_types=1);
class ClassWithNamedService implements ContainerAwareInterface class ClassWithNamedService implements ContainerAwareInterface
{ {
/** /**