add StateHolder as hotfix for printer bug

This commit is contained in:
TomasVotruba 2017-07-20 19:45:25 +02:00
parent 5dfa359257
commit 9ab6c84629
3 changed files with 45 additions and 3 deletions

View File

@ -0,0 +1,22 @@
<?php declare(strict_types=1);
namespace Rector\NodeTraverser;
final class StateHolder
{
/**
* @var bool
*/
private $isAfterTraverseCalled = false;
public function setAfterTraverserIsCalled(): void
{
$this->isAfterTraverseCalled = true;
}
public function isAfterTraverseCalled(): bool
{
return $this->isAfterTraverseCalled;
}
}

View File

@ -8,6 +8,7 @@ use PhpParser\NodeVisitorAbstract;
use Rector\Builder\Class_\ClassPropertyCollector; use Rector\Builder\Class_\ClassPropertyCollector;
use Rector\Builder\ConstructorMethodBuilder; use Rector\Builder\ConstructorMethodBuilder;
use Rector\Builder\PropertyBuilder; use Rector\Builder\PropertyBuilder;
use Rector\NodeTraverser\StateHolder;
/** /**
* Add new propertis to class and to contructor. * Add new propertis to class and to contructor.
@ -29,14 +30,21 @@ final class AddPropertiesToClassNodeVisitor extends NodeVisitorAbstract
*/ */
private $newClassPropertyCollector; private $newClassPropertyCollector;
/**
* @var StateHolder
*/
private $stateHolder;
public function __construct( public function __construct(
ConstructorMethodBuilder $constructorMethodBuilder, ConstructorMethodBuilder $constructorMethodBuilder,
PropertyBuilder $propertyBuilder, PropertyBuilder $propertyBuilder,
ClassPropertyCollector $newClassPropertyCollector ClassPropertyCollector $newClassPropertyCollector,
StateHolder $stateHolder
) { ) {
$this->constructorMethodBuilder = $constructorMethodBuilder; $this->constructorMethodBuilder = $constructorMethodBuilder;
$this->propertyBuilder = $propertyBuilder; $this->propertyBuilder = $propertyBuilder;
$this->newClassPropertyCollector = $newClassPropertyCollector; $this->newClassPropertyCollector = $newClassPropertyCollector;
$this->stateHolder = $stateHolder;
} }
/** /**
@ -60,6 +68,7 @@ final class AddPropertiesToClassNodeVisitor extends NodeVisitorAbstract
$propertiesForClass = $this->newClassPropertyCollector->getPropertiesforClass($className); $propertiesForClass = $this->newClassPropertyCollector->getPropertiesforClass($className);
foreach ($propertiesForClass as $propertyType => $propertyName) { foreach ($propertiesForClass as $propertyType => $propertyName) {
$this->stateHolder->setAfterTraverserIsCalled();
$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

@ -3,9 +3,9 @@
namespace Rector\Testing\Application; namespace Rector\Testing\Application;
use PhpParser\Lexer; use PhpParser\Lexer;
use PhpParser\Node;
use PhpParser\NodeTraverser; use PhpParser\NodeTraverser;
use PhpParser\Parser; use PhpParser\Parser;
use Rector\NodeTraverser\StateHolder;
use Rector\Printer\CodeStyledPrinter; use Rector\Printer\CodeStyledPrinter;
use SplFileInfo; use SplFileInfo;
@ -31,16 +31,23 @@ final class FileReconstructor
*/ */
private $nodeTraverser; private $nodeTraverser;
/**
* @var StateHolder
*/
private $stateHolder;
public function __construct( public function __construct(
Parser $parser, Parser $parser,
CodeStyledPrinter $codeStyledPrinter, CodeStyledPrinter $codeStyledPrinter,
Lexer $lexer, Lexer $lexer,
NodeTraverser $nodeTraverser NodeTraverser $nodeTraverser,
StateHolder $stateHolder
) { ) {
$this->parser = $parser; $this->parser = $parser;
$this->codeStyledPrinter = $codeStyledPrinter; $this->codeStyledPrinter = $codeStyledPrinter;
$this->lexer = $lexer; $this->lexer = $lexer;
$this->nodeTraverser = $nodeTraverser; $this->nodeTraverser = $nodeTraverser;
$this->stateHolder = $stateHolder;
} }
# ref: https://github.com/nikic/PHP-Parser/issues/344#issuecomment-298162516 # ref: https://github.com/nikic/PHP-Parser/issues/344#issuecomment-298162516
@ -52,6 +59,10 @@ final class FileReconstructor
$oldTokens = $this->lexer->getTokens(); $oldTokens = $this->lexer->getTokens();
$newStmts = $this->nodeTraverser->traverse($oldStmts); $newStmts = $this->nodeTraverser->traverse($oldStmts);
if (! $this->stateHolder->isAfterTraverseCalled()) {
[$newStmts, $oldStmts] = [$oldStmts, $newStmts];
}
return $this->codeStyledPrinter->printToString($newStmts, $oldStmts, $oldTokens); return $this->codeStyledPrinter->printToString($newStmts, $oldStmts, $oldTokens);
} }
} }