Updated Rector to commit e2cc867255

e2cc867255 [PhpSpecToPHPUnit] Deprecate historical set, mostly for experimental in early days (#1901)
This commit is contained in:
Tomas Votruba 2022-03-03 19:57:16 +00:00
parent be1a72534c
commit d7bd6b98d4
49 changed files with 831 additions and 2618 deletions

View File

@ -1,27 +0,0 @@
<?php
declare (strict_types=1);
namespace RectorPrefix20220303;
use Rector\PhpSpecToPHPUnit\Rector\Class_\AddMockPropertiesRector;
use Rector\PhpSpecToPHPUnit\Rector\Class_\PhpSpecClassToPHPUnitClassRector;
use Rector\PhpSpecToPHPUnit\Rector\Class_\RenameSpecFileToTestFileRector;
use Rector\PhpSpecToPHPUnit\Rector\ClassMethod\PhpSpecMethodToPHPUnitMethodRector;
use Rector\PhpSpecToPHPUnit\Rector\MethodCall\PhpSpecMocksToPHPUnitMocksRector;
use Rector\PhpSpecToPHPUnit\Rector\MethodCall\PhpSpecPromisesToPHPUnitAssertRector;
use Rector\PhpSpecToPHPUnit\Rector\Variable\MockVariableToPropertyFetchRector;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
# see: https://gnugat.github.io/2015/09/23/phpunit-with-phpspec.html
return static function (\Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator $containerConfigurator) : void {
$services = $containerConfigurator->services();
# 1. first convert mocks
$services->set(\Rector\PhpSpecToPHPUnit\Rector\MethodCall\PhpSpecMocksToPHPUnitMocksRector::class);
$services->set(\Rector\PhpSpecToPHPUnit\Rector\MethodCall\PhpSpecPromisesToPHPUnitAssertRector::class);
# 2. then methods
$services->set(\Rector\PhpSpecToPHPUnit\Rector\ClassMethod\PhpSpecMethodToPHPUnitMethodRector::class);
# 3. then the class itself
$services->set(\Rector\PhpSpecToPHPUnit\Rector\Class_\PhpSpecClassToPHPUnitClassRector::class);
$services->set(\Rector\PhpSpecToPHPUnit\Rector\Class_\AddMockPropertiesRector::class);
$services->set(\Rector\PhpSpecToPHPUnit\Rector\Variable\MockVariableToPropertyFetchRector::class);
$services->set(\Rector\PhpSpecToPHPUnit\Rector\Class_\RenameSpecFileToTestFileRector::class);
};

View File

@ -1,4 +1,4 @@
# 512 Rules Overview
# 505 Rules Overview
<br>
@ -74,8 +74,6 @@
- [Php81](#php81) (9)
- [PhpSpecToPHPUnit](#phpspectophpunit) (7)
- [PostRector](#postrector) (7)
- [Privatization](#privatization) (10)
@ -8550,225 +8548,6 @@ Refactor Spatie enum class to native Enum
<br>
## PhpSpecToPHPUnit
### AddMockPropertiesRector
Migrate PhpSpec behavior to PHPUnit test
- class: [`Rector\PhpSpecToPHPUnit\Rector\Class_\AddMockPropertiesRector`](../rules/PhpSpecToPHPUnit/Rector/Class_/AddMockPropertiesRector.php)
```diff
namespace spec\SomeNamespaceForThisTest;
-use PhpSpec\ObjectBehavior;
-
class OrderSpec extends ObjectBehavior
{
- public function let(OrderFactory $factory, ShippingMethod $shippingMethod): void
+ /**
+ * @var \SomeNamespaceForThisTest\Order
+ */
+ private $order;
+ protected function setUp()
{
- $factory->createShippingMethodFor(Argument::any())->shouldBeCalled()->willReturn($shippingMethod);
+ /** @var OrderFactory|\PHPUnit\Framework\MockObject\MockObject $factory */
+ $factory = $this->createMock(OrderFactory::class);
+
+ /** @var ShippingMethod|\PHPUnit\Framework\MockObject\MockObject $shippingMethod */
+ $shippingMethod = $this->createMock(ShippingMethod::class);
+
+ $factory->expects($this->once())->method('createShippingMethodFor')->willReturn($shippingMethod);
}
}
```
<br>
### MockVariableToPropertyFetchRector
Migrate PhpSpec behavior to PHPUnit test
- class: [`Rector\PhpSpecToPHPUnit\Rector\Variable\MockVariableToPropertyFetchRector`](../rules/PhpSpecToPHPUnit/Rector/Variable/MockVariableToPropertyFetchRector.php)
```diff
namespace spec\SomeNamespaceForThisTest;
-use PhpSpec\ObjectBehavior;
-
class OrderSpec extends ObjectBehavior
{
- public function let(OrderFactory $factory, ShippingMethod $shippingMethod): void
+ /**
+ * @var \SomeNamespaceForThisTest\Order
+ */
+ private $order;
+ protected function setUp()
{
- $factory->createShippingMethodFor(Argument::any())->shouldBeCalled()->willReturn($shippingMethod);
+ /** @var OrderFactory|\PHPUnit\Framework\MockObject\MockObject $factory */
+ $factory = $this->createMock(OrderFactory::class);
+
+ /** @var ShippingMethod|\PHPUnit\Framework\MockObject\MockObject $shippingMethod */
+ $shippingMethod = $this->createMock(ShippingMethod::class);
+
+ $factory->expects($this->once())->method('createShippingMethodFor')->willReturn($shippingMethod);
}
}
```
<br>
### PhpSpecClassToPHPUnitClassRector
Migrate PhpSpec behavior to PHPUnit test
- class: [`Rector\PhpSpecToPHPUnit\Rector\Class_\PhpSpecClassToPHPUnitClassRector`](../rules/PhpSpecToPHPUnit/Rector/Class_/PhpSpecClassToPHPUnitClassRector.php)
```diff
namespace spec\SomeNamespaceForThisTest;
-use PhpSpec\ObjectBehavior;
-
class OrderSpec extends ObjectBehavior
{
- public function let(OrderFactory $factory, ShippingMethod $shippingMethod): void
+ /**
+ * @var \SomeNamespaceForThisTest\Order
+ */
+ private $order;
+ protected function setUp()
{
- $factory->createShippingMethodFor(Argument::any())->shouldBeCalled()->willReturn($shippingMethod);
+ /** @var OrderFactory|\PHPUnit\Framework\MockObject\MockObject $factory */
+ $factory = $this->createMock(OrderFactory::class);
+
+ /** @var ShippingMethod|\PHPUnit\Framework\MockObject\MockObject $shippingMethod */
+ $shippingMethod = $this->createMock(ShippingMethod::class);
+
+ $factory->expects($this->once())->method('createShippingMethodFor')->willReturn($shippingMethod);
}
}
```
<br>
### PhpSpecMethodToPHPUnitMethodRector
Migrate PhpSpec behavior to PHPUnit test
- class: [`Rector\PhpSpecToPHPUnit\Rector\ClassMethod\PhpSpecMethodToPHPUnitMethodRector`](../rules/PhpSpecToPHPUnit/Rector/ClassMethod/PhpSpecMethodToPHPUnitMethodRector.php)
```diff
namespace spec\SomeNamespaceForThisTest;
-use PhpSpec\ObjectBehavior;
-
class OrderSpec extends ObjectBehavior
{
- public function let(OrderFactory $factory, ShippingMethod $shippingMethod): void
+ /**
+ * @var \SomeNamespaceForThisTest\Order
+ */
+ private $order;
+ protected function setUp()
{
- $factory->createShippingMethodFor(Argument::any())->shouldBeCalled()->willReturn($shippingMethod);
+ /** @var OrderFactory|\PHPUnit\Framework\MockObject\MockObject $factory */
+ $factory = $this->createMock(OrderFactory::class);
+
+ /** @var ShippingMethod|\PHPUnit\Framework\MockObject\MockObject $shippingMethod */
+ $shippingMethod = $this->createMock(ShippingMethod::class);
+
+ $factory->expects($this->once())->method('createShippingMethodFor')->willReturn($shippingMethod);
}
}
```
<br>
### PhpSpecMocksToPHPUnitMocksRector
Migrate PhpSpec behavior to PHPUnit test
- class: [`Rector\PhpSpecToPHPUnit\Rector\MethodCall\PhpSpecMocksToPHPUnitMocksRector`](../rules/PhpSpecToPHPUnit/Rector/MethodCall/PhpSpecMocksToPHPUnitMocksRector.php)
```diff
namespace spec\SomeNamespaceForThisTest;
-use PhpSpec\ObjectBehavior;
-
class OrderSpec extends ObjectBehavior
{
- public function let(OrderFactory $factory, ShippingMethod $shippingMethod): void
+ /**
+ * @var \SomeNamespaceForThisTest\Order
+ */
+ private $order;
+ protected function setUp()
{
- $factory->createShippingMethodFor(Argument::any())->shouldBeCalled()->willReturn($shippingMethod);
+ /** @var OrderFactory|\PHPUnit\Framework\MockObject\MockObject $factory */
+ $factory = $this->createMock(OrderFactory::class);
+
+ /** @var ShippingMethod|\PHPUnit\Framework\MockObject\MockObject $shippingMethod */
+ $shippingMethod = $this->createMock(ShippingMethod::class);
+
+ $factory->expects($this->once())->method('createShippingMethodFor')->willReturn($shippingMethod);
}
}
```
<br>
### PhpSpecPromisesToPHPUnitAssertRector
Migrate PhpSpec behavior to PHPUnit test
- class: [`Rector\PhpSpecToPHPUnit\Rector\MethodCall\PhpSpecPromisesToPHPUnitAssertRector`](../rules/PhpSpecToPHPUnit/Rector/MethodCall/PhpSpecPromisesToPHPUnitAssertRector.php)
```diff
namespace spec\SomeNamespaceForThisTest;
-use PhpSpec\ObjectBehavior;
-
class OrderSpec extends ObjectBehavior
{
- public function let(OrderFactory $factory, ShippingMethod $shippingMethod): void
+ /**
+ * @var \SomeNamespaceForThisTest\Order
+ */
+ private $order;
+ protected function setUp()
{
- $factory->createShippingMethodFor(Argument::any())->shouldBeCalled()->willReturn($shippingMethod);
+ /** @var OrderFactory|\PHPUnit\Framework\MockObject\MockObject $factory */
+ $factory = $this->createMock(OrderFactory::class);
+
+ /** @var ShippingMethod|\PHPUnit\Framework\MockObject\MockObject $shippingMethod */
+ $shippingMethod = $this->createMock(ShippingMethod::class);
+
+ $factory->expects($this->once())->method('createShippingMethodFor')->willReturn($shippingMethod);
}
}
```
<br>
### RenameSpecFileToTestFileRector
Rename "*Spec.php" file to "*Test.php" file
- class: [`Rector\PhpSpecToPHPUnit\Rector\Class_\RenameSpecFileToTestFileRector`](../rules/PhpSpecToPHPUnit/Rector/Class_/RenameSpecFileToTestFileRector.php)
```diff
-// tests/SomeSpec.php
+// tests/SomeTest.php
```
<br>
## PostRector
### ClassRenamingPostRector

View File

@ -66,10 +66,6 @@ final class SetList implements \Rector\Set\Contract\SetListInterface
* @var string
*/
public const PHPSPEC_40 = __DIR__ . '/../../../config/set/phpspec40.php';
/**
* @var string
*/
public const PHPSPEC_TO_PHPUNIT = __DIR__ . '/../../../config/set/phpspec-to-phpunit.php';
/**
* @var string
*/

View File

@ -1,48 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\PhpSpecToPHPUnit;
use PhpParser\Node;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Stmt\Class_;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\NodeNameResolver\NodeNameResolver;
final class LetManipulator
{
/**
* @readonly
* @var \Rector\Core\PhpParser\Node\BetterNodeFinder
*/
private $betterNodeFinder;
/**
* @readonly
* @var \Rector\NodeNameResolver\NodeNameResolver
*/
private $nodeNameResolver;
public function __construct(\Rector\Core\PhpParser\Node\BetterNodeFinder $betterNodeFinder, \Rector\NodeNameResolver\NodeNameResolver $nodeNameResolver)
{
$this->betterNodeFinder = $betterNodeFinder;
$this->nodeNameResolver = $nodeNameResolver;
}
public function isLetNeededInClass(\PhpParser\Node\Stmt\Class_ $class) : bool
{
foreach ($class->getMethods() as $classMethod) {
// new test
if ($this->nodeNameResolver->isName($classMethod, 'test*')) {
continue;
}
$hasBeConstructedThrough = (bool) $this->betterNodeFinder->find((array) $classMethod->stmts, function (\PhpParser\Node $node) : bool {
if (!$node instanceof \PhpParser\Node\Expr\MethodCall) {
return \false;
}
return $this->nodeNameResolver->isName($node->name, 'beConstructedThrough');
});
if ($hasBeConstructedThrough) {
continue;
}
return \true;
}
return \false;
}
}

View File

@ -1,44 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\PhpSpecToPHPUnit;
use PhpParser\Node\Expr\Array_;
use PhpParser\Node\Scalar\String_;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Return_;
final class MatchersManipulator
{
/**
* @return string[]
*/
public function resolveMatcherNamesFromClass(\PhpParser\Node\Stmt\Class_ $class) : array
{
$classMethod = $class->getMethod('getMatchers');
if (!$classMethod instanceof \PhpParser\Node\Stmt\ClassMethod) {
return [];
}
if (!isset($classMethod->stmts[0])) {
return [];
}
if (!$classMethod->stmts[0] instanceof \PhpParser\Node\Stmt\Return_) {
return [];
}
/** @var Return_ $return */
$return = $classMethod->stmts[0];
if (!$return->expr instanceof \PhpParser\Node\Expr\Array_) {
return [];
}
$keys = [];
foreach ($return->expr->items as $arrayItem) {
if ($arrayItem === null) {
continue;
}
if ($arrayItem->key instanceof \PhpParser\Node\Scalar\String_) {
$keys[] = $arrayItem->key->value;
}
}
return $keys;
}
}

View File

@ -1,123 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\PhpSpecToPHPUnit\Naming;
use PhpParser\Node;
use PhpParser\Node\Identifier;
use PhpParser\Node\Name;
use PhpParser\Node\Name\FullyQualified;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassLike;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Namespace_;
use Rector\Core\Exception\ShouldNotHappenException;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\Core\Util\StaticRectorStrings;
use Rector\NodeNameResolver\NodeNameResolver;
use RectorPrefix20220303\Symplify\PackageBuilder\Strings\StringFormatConverter;
final class PhpSpecRenaming
{
/**
* @var string
*/
private const SPEC = 'Spec';
/**
* @readonly
* @var \Rector\NodeNameResolver\NodeNameResolver
*/
private $nodeNameResolver;
/**
* @readonly
* @var \Symplify\PackageBuilder\Strings\StringFormatConverter
*/
private $stringFormatConverter;
/**
* @readonly
* @var \Rector\Core\PhpParser\Node\BetterNodeFinder
*/
private $betterNodeFinder;
public function __construct(\Rector\NodeNameResolver\NodeNameResolver $nodeNameResolver, \RectorPrefix20220303\Symplify\PackageBuilder\Strings\StringFormatConverter $stringFormatConverter, \Rector\Core\PhpParser\Node\BetterNodeFinder $betterNodeFinder)
{
$this->nodeNameResolver = $nodeNameResolver;
$this->stringFormatConverter = $stringFormatConverter;
$this->betterNodeFinder = $betterNodeFinder;
}
public function renameMethod(\PhpParser\Node\Stmt\ClassMethod $classMethod) : void
{
if ($classMethod->isPrivate()) {
return;
}
$classMethodName = $this->nodeNameResolver->getName($classMethod);
$classMethodName = $this->removeNamePrefixes($classMethodName);
// from PhpSpec to PHPUnit method naming convention
$classMethodName = $this->stringFormatConverter->underscoreAndHyphenToCamelCase($classMethodName);
// add "test", so PHPUnit runs the method
if (\strncmp($classMethodName, 'test', \strlen('test')) !== 0) {
$classMethodName = 'test' . \ucfirst($classMethodName);
}
$classMethod->name = new \PhpParser\Node\Identifier($classMethodName);
}
public function renameExtends(\PhpParser\Node\Stmt\Class_ $class) : void
{
$class->extends = new \PhpParser\Node\Name\FullyQualified('PHPUnit\\Framework\\TestCase');
}
public function renameNamespace(\PhpParser\Node\Stmt\Class_ $class) : void
{
$namespace = $this->betterNodeFinder->findParentType($class, \PhpParser\Node\Stmt\Namespace_::class);
if (!$namespace instanceof \PhpParser\Node\Stmt\Namespace_) {
return;
}
$namespaceName = $this->nodeNameResolver->getName($namespace);
if ($namespaceName === null) {
return;
}
$newNamespaceName = \Rector\Core\Util\StaticRectorStrings::removePrefixes($namespaceName, ['spec\\']);
$namespace->name = new \PhpParser\Node\Name('Tests\\' . $newNamespaceName);
}
public function renameClass(\PhpParser\Node\Stmt\Class_ $class) : void
{
$classShortName = $this->nodeNameResolver->getShortName($class);
// anonymous class?
if ($classShortName === '') {
throw new \Rector\Core\Exception\ShouldNotHappenException();
}
// 2. change class name
$newClassName = \Rector\Core\Util\StaticRectorStrings::removeSuffixes($classShortName, [self::SPEC]);
$newTestClassName = $newClassName . 'Test';
$class->name = new \PhpParser\Node\Identifier($newTestClassName);
}
public function resolveObjectPropertyName(\PhpParser\Node\Stmt\Class_ $class) : string
{
// anonymous class?
if ($class->name === null) {
throw new \Rector\Core\Exception\ShouldNotHappenException();
}
$shortClassName = $this->nodeNameResolver->getShortName($class);
$bareClassName = \Rector\Core\Util\StaticRectorStrings::removeSuffixes($shortClassName, [self::SPEC, 'Test']);
return \lcfirst($bareClassName);
}
public function resolveTestedClass(\PhpParser\Node $node) : string
{
if ($node instanceof \PhpParser\Node\Stmt\ClassLike) {
$className = (string) $this->nodeNameResolver->getName($node);
} else {
$classLike = $this->betterNodeFinder->findParentType($node, \PhpParser\Node\Stmt\ClassLike::class);
if (!$classLike instanceof \PhpParser\Node\Stmt\ClassLike) {
throw new \Rector\Core\Exception\ShouldNotHappenException();
}
$className = (string) $this->nodeNameResolver->getName($classLike);
}
$newClassName = \Rector\Core\Util\StaticRectorStrings::removePrefixes($className, ['spec\\']);
return \Rector\Core\Util\StaticRectorStrings::removeSuffixes($newClassName, [self::SPEC]);
}
private function removeNamePrefixes(string $name) : string
{
$originalName = $name;
$name = \Rector\Core\Util\StaticRectorStrings::removePrefixes($name, ['it_should_have_', 'it_should_be', 'it_should_', 'it_is_', 'it_', 'is_']);
if ($name === '') {
return $originalName;
}
return $name;
}
}

View File

@ -1,81 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\PhpSpecToPHPUnit\NodeFactory;
use PhpParser\Node\Arg;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Expr\PropertyFetch;
use PhpParser\Node\Expr\Variable;
use Rector\Core\PhpParser\Node\NodeFactory;
use Rector\Core\PhpParser\Node\Value\ValueResolver;
use Rector\NodeNameResolver\NodeNameResolver;
final class AssertMethodCallFactory
{
/**
* @var bool
*/
private $isBoolAssert = \false;
/**
* @readonly
* @var \Rector\Core\PhpParser\Node\NodeFactory
*/
private $nodeFactory;
/**
* @readonly
* @var \Rector\NodeNameResolver\NodeNameResolver
*/
private $nodeNameResolver;
/**
* @readonly
* @var \Rector\Core\PhpParser\Node\Value\ValueResolver
*/
private $valueResolver;
public function __construct(\Rector\Core\PhpParser\Node\NodeFactory $nodeFactory, \Rector\NodeNameResolver\NodeNameResolver $nodeNameResolver, \Rector\Core\PhpParser\Node\Value\ValueResolver $valueResolver)
{
$this->nodeFactory = $nodeFactory;
$this->nodeNameResolver = $nodeNameResolver;
$this->valueResolver = $valueResolver;
}
public function createAssertMethod(string $name, \PhpParser\Node\Expr $value, ?\PhpParser\Node\Expr $expected, \PhpParser\Node\Expr\PropertyFetch $testedObjectPropertyFetch) : \PhpParser\Node\Expr\MethodCall
{
$this->isBoolAssert = \false;
// special case with bool!
if ($expected instanceof \PhpParser\Node\Expr) {
$name = $this->resolveBoolMethodName($name, $expected);
}
$assetMethodCall = $this->nodeFactory->createMethodCall('this', $name);
if (!$this->isBoolAssert && $expected instanceof \PhpParser\Node\Expr) {
$assetMethodCall->args[] = new \PhpParser\Node\Arg($this->thisToTestedObjectPropertyFetch($expected, $testedObjectPropertyFetch));
}
$assetMethodCall->args[] = new \PhpParser\Node\Arg($this->thisToTestedObjectPropertyFetch($value, $testedObjectPropertyFetch));
return $assetMethodCall;
}
private function resolveBoolMethodName(string $name, \PhpParser\Node\Expr $expr) : string
{
if (!$this->valueResolver->isTrueOrFalse($expr)) {
return $name;
}
$isFalse = $this->valueResolver->isFalse($expr);
if ($name === 'assertSame') {
$this->isBoolAssert = \true;
return $isFalse ? 'assertFalse' : 'assertTrue';
}
if ($name === 'assertNotSame') {
$this->isBoolAssert = \true;
return $isFalse ? 'assertNotFalse' : 'assertNotTrue';
}
return $name;
}
private function thisToTestedObjectPropertyFetch(\PhpParser\Node\Expr $expr, \PhpParser\Node\Expr\PropertyFetch $propertyFetch) : \PhpParser\Node\Expr
{
if (!$expr instanceof \PhpParser\Node\Expr\Variable) {
return $expr;
}
if (!$this->nodeNameResolver->isName($expr, 'this')) {
return $expr;
}
return $propertyFetch;
}
}

View File

@ -1,82 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\PhpSpecToPHPUnit\NodeFactory;
use PhpParser\Node\Arg;
use PhpParser\Node\Expr\Array_;
use PhpParser\Node\Expr\ArrayItem;
use PhpParser\Node\Expr\Assign;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Expr\New_;
use PhpParser\Node\Expr\PropertyFetch;
use PhpParser\Node\Expr\StaticCall;
use PhpParser\Node\Name\FullyQualified;
use Rector\Core\PhpParser\Node\NodeFactory;
use Rector\Core\PhpParser\Node\Value\ValueResolver;
use Rector\NodeNameResolver\NodeNameResolver;
final class BeConstructedWithAssignFactory
{
/**
* @readonly
* @var \Rector\NodeNameResolver\NodeNameResolver
*/
private $nodeNameResolver;
/**
* @readonly
* @var \Rector\Core\PhpParser\Node\Value\ValueResolver
*/
private $valueResolver;
/**
* @readonly
* @var \Rector\Core\PhpParser\Node\NodeFactory
*/
private $nodeFactory;
public function __construct(\Rector\NodeNameResolver\NodeNameResolver $nodeNameResolver, \Rector\Core\PhpParser\Node\Value\ValueResolver $valueResolver, \Rector\Core\PhpParser\Node\NodeFactory $nodeFactory)
{
$this->nodeNameResolver = $nodeNameResolver;
$this->valueResolver = $valueResolver;
$this->nodeFactory = $nodeFactory;
}
public function create(\PhpParser\Node\Expr\MethodCall $methodCall, string $testedClass, \PhpParser\Node\Expr\PropertyFetch $propertyFetch) : ?\PhpParser\Node\Expr\Assign
{
if ($this->nodeNameResolver->isName($methodCall->name, 'beConstructedWith')) {
$new = new \PhpParser\Node\Expr\New_(new \PhpParser\Node\Name\FullyQualified($testedClass));
$new->args = $methodCall->args;
return new \PhpParser\Node\Expr\Assign($propertyFetch, $new);
}
if ($this->nodeNameResolver->isName($methodCall->name, 'beConstructedThrough')) {
if (!isset($methodCall->args[0])) {
return null;
}
if (!$methodCall->args[0] instanceof \PhpParser\Node\Arg) {
return null;
}
$methodName = $this->valueResolver->getValue($methodCall->args[0]->value);
$staticCall = $this->nodeFactory->createStaticCall($testedClass, $methodName);
$this->moveConstructorArguments($methodCall, $staticCall);
return new \PhpParser\Node\Expr\Assign($propertyFetch, $staticCall);
}
return null;
}
private function moveConstructorArguments(\PhpParser\Node\Expr\MethodCall $methodCall, \PhpParser\Node\Expr\StaticCall $staticCall) : void
{
if (!isset($methodCall->args[1])) {
return;
}
if (!$methodCall->args[1] instanceof \PhpParser\Node\Arg) {
return;
}
if (!$methodCall->args[1]->value instanceof \PhpParser\Node\Expr\Array_) {
return;
}
/** @var Array_ $array */
$array = $methodCall->args[1]->value;
foreach ($array->items as $arrayItem) {
if (!$arrayItem instanceof \PhpParser\Node\Expr\ArrayItem) {
continue;
}
$staticCall->args[] = new \PhpParser\Node\Arg($arrayItem->value);
}
}
}

View File

@ -1,55 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\PhpSpecToPHPUnit\NodeFactory;
use PhpParser\Node\Arg;
use PhpParser\Node\Expr\Array_;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Expr\PropertyFetch;
use PhpParser\Node\Identifier;
use Rector\Core\Exception\ShouldNotHappenException;
use Rector\Core\PhpParser\Node\Value\ValueResolver;
use Rector\PostRector\Collector\NodesToAddCollector;
final class DuringMethodCallFactory
{
/**
* @readonly
* @var \Rector\Core\PhpParser\Node\Value\ValueResolver
*/
private $valueResolver;
/**
* @readonly
* @var \Rector\PostRector\Collector\NodesToAddCollector
*/
private $nodesToAddCollector;
public function __construct(\Rector\Core\PhpParser\Node\Value\ValueResolver $valueResolver, \Rector\PostRector\Collector\NodesToAddCollector $nodesToAddCollector)
{
$this->valueResolver = $valueResolver;
$this->nodesToAddCollector = $nodesToAddCollector;
}
public function create(\PhpParser\Node\Expr\MethodCall $methodCall, \PhpParser\Node\Expr\PropertyFetch $propertyFetch) : \PhpParser\Node\Expr\MethodCall
{
if (!isset($methodCall->args[0])) {
throw new \Rector\Core\Exception\ShouldNotHappenException();
}
if (!$methodCall->args[0] instanceof \PhpParser\Node\Arg) {
throw new \Rector\Core\Exception\ShouldNotHappenException();
}
$name = $this->valueResolver->getValue($methodCall->args[0]->value);
$thisObjectPropertyMethodCall = new \PhpParser\Node\Expr\MethodCall($propertyFetch, $name);
if (isset($methodCall->args[1]) && $methodCall->args[1] instanceof \PhpParser\Node\Arg && $methodCall->args[1]->value instanceof \PhpParser\Node\Expr\Array_) {
/** @var Array_ $array */
$array = $methodCall->args[1]->value;
if (isset($array->items[0])) {
$thisObjectPropertyMethodCall->args[] = new \PhpParser\Node\Arg($array->items[0]->value);
}
}
/** @var MethodCall $parentMethodCall */
$parentMethodCall = $methodCall->var;
$parentMethodCall->name = new \PhpParser\Node\Identifier('expectException');
// add $this->object->someCall($withArgs)
$this->nodesToAddCollector->addNodeAfterNode($thisObjectPropertyMethodCall, $methodCall);
return $parentMethodCall;
}
}

View File

@ -1,112 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\PhpSpecToPHPUnit;
use PhpParser\Node;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Param;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassMethod;
use Rector\Core\Exception\ShouldNotHappenException;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\NodeNameResolver\NodeNameResolver;
use Rector\NodeTypeResolver\Node\AttributeKey;
use RectorPrefix20220303\Symplify\Astral\NodeTraverser\SimpleCallableNodeTraverser;
final class PhpSpecMockCollector
{
/**
* @var mixed[]
*/
private $mocks = [];
/**
* @var mixed[]
*/
private $mocksWithsTypes = [];
/**
* @var mixed[]
*/
private $propertyMocksByClass = [];
/**
* @readonly
* @var \Symplify\Astral\NodeTraverser\SimpleCallableNodeTraverser
*/
private $simpleCallableNodeTraverser;
/**
* @readonly
* @var \Rector\NodeNameResolver\NodeNameResolver
*/
private $nodeNameResolver;
/**
* @readonly
* @var \Rector\Core\PhpParser\Node\BetterNodeFinder
*/
private $betterNodeFinder;
public function __construct(\RectorPrefix20220303\Symplify\Astral\NodeTraverser\SimpleCallableNodeTraverser $simpleCallableNodeTraverser, \Rector\NodeNameResolver\NodeNameResolver $nodeNameResolver, \Rector\Core\PhpParser\Node\BetterNodeFinder $betterNodeFinder)
{
$this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser;
$this->nodeNameResolver = $nodeNameResolver;
$this->betterNodeFinder = $betterNodeFinder;
}
/**
* @return mixed[]
*/
public function resolveClassMocksFromParam(\PhpParser\Node\Stmt\Class_ $class) : array
{
$className = (string) $this->nodeNameResolver->getName($class);
if (isset($this->mocks[$className]) && $this->mocks[$className] !== []) {
return $this->mocks[$className];
}
$this->simpleCallableNodeTraverser->traverseNodesWithCallable($class, function (\PhpParser\Node $node) use($class) {
if (!$node instanceof \PhpParser\Node\Stmt\ClassMethod) {
return null;
}
if (!$node->isPublic()) {
return null;
}
foreach ($node->params as $param) {
$this->addMockFromParam($class, $param);
}
return null;
});
// set default value if none was found
if (!isset($this->mocks[$className])) {
$this->mocks[$className] = [];
}
return $this->mocks[$className];
}
public function isVariableMockInProperty(\PhpParser\Node\Stmt\Class_ $class, \PhpParser\Node\Expr\Variable $variable) : bool
{
$variableName = $this->nodeNameResolver->getName($variable);
$className = (string) $this->nodeNameResolver->getName($class);
return \in_array($variableName, $this->propertyMocksByClass[$className] ?? [], \true);
}
public function getTypeForClassAndVariable(\PhpParser\Node\Stmt\Class_ $class, string $variable) : string
{
$className = (string) $this->nodeNameResolver->getName($class);
if (!isset($this->mocksWithsTypes[$className][$variable])) {
throw new \Rector\Core\Exception\ShouldNotHappenException();
}
return $this->mocksWithsTypes[$className][$variable];
}
public function addPropertyMock(string $class, string $property) : void
{
$this->propertyMocksByClass[$class][] = $property;
}
private function addMockFromParam(\PhpParser\Node\Stmt\Class_ $class, \PhpParser\Node\Param $param) : void
{
$variable = $this->nodeNameResolver->getName($param->var);
$className = (string) $this->nodeNameResolver->getName($class);
$classMethod = $this->betterNodeFinder->findParentType($param, \PhpParser\Node\Stmt\ClassMethod::class);
if (!$classMethod instanceof \PhpParser\Node\Stmt\ClassMethod) {
throw new \Rector\Core\Exception\ShouldNotHappenException();
}
$methodName = $this->nodeNameResolver->getName($classMethod);
$this->mocks[$className][$variable][] = $methodName;
if ($param->type === null) {
throw new \Rector\Core\Exception\ShouldNotHappenException();
}
$paramType = (string) ($param->type ?? $param->type->getAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::ORIGINAL_NAME));
$this->mocksWithsTypes[$className][$variable] = $paramType;
}
}

View File

@ -1,67 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\PhpSpecToPHPUnit\Rector;
use PhpParser\Node;
use PhpParser\Node\Stmt\ClassLike;
use PHPStan\Type\ObjectType;
use Rector\Core\Rector\AbstractRector;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
/**
* @changelog https://gnugat.github.io/2015/09/23/phpunit-with-phpspec.html
* @changelog http://www.phpspec.net/en/stable/cookbook/construction.html
*/
abstract class AbstractPhpSpecToPHPUnitRector extends \Rector\Core\Rector\AbstractRector
{
public function getRuleDefinition() : \Symplify\RuleDocGenerator\ValueObject\RuleDefinition
{
return new \Symplify\RuleDocGenerator\ValueObject\RuleDefinition('Migrate PhpSpec behavior to PHPUnit test', [new \Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample(<<<'CODE_SAMPLE'
namespace spec\SomeNamespaceForThisTest;
use PhpSpec\ObjectBehavior;
class OrderSpec extends ObjectBehavior
{
public function let(OrderFactory $factory, ShippingMethod $shippingMethod): void
{
$factory->createShippingMethodFor(Argument::any())->shouldBeCalled()->willReturn($shippingMethod);
}
}
CODE_SAMPLE
, <<<'CODE_SAMPLE'
namespace spec\SomeNamespaceForThisTest;
class OrderSpec extends ObjectBehavior
{
/**
* @var \SomeNamespaceForThisTest\Order
*/
private $order;
protected function setUp()
{
/** @var OrderFactory|\PHPUnit\Framework\MockObject\MockObject $factory */
$factory = $this->createMock(OrderFactory::class);
/** @var ShippingMethod|\PHPUnit\Framework\MockObject\MockObject $shippingMethod */
$shippingMethod = $this->createMock(ShippingMethod::class);
$factory->expects($this->once())->method('createShippingMethodFor')->willReturn($shippingMethod);
}
}
CODE_SAMPLE
)]);
}
protected function isInPhpSpecBehavior(\PhpParser\Node $node) : bool
{
if ($node instanceof \PhpParser\Node\Stmt\ClassLike) {
return $this->isObjectType($node, new \PHPStan\Type\ObjectType('PhpSpec\\ObjectBehavior'));
}
$classLike = $this->betterNodeFinder->findParentType($node, \PhpParser\Node\Stmt\ClassLike::class);
if (!$classLike instanceof \PhpParser\Node\Stmt\ClassLike) {
return \false;
}
return $this->isInPhpSpecBehavior($classLike);
}
}

View File

@ -1,93 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\PhpSpecToPHPUnit\Rector\ClassMethod;
use PhpParser\Node;
use PhpParser\Node\Identifier;
use PhpParser\Node\Stmt;
use PhpParser\Node\Stmt\ClassMethod;
use Rector\Core\ValueObject\MethodName;
use Rector\PhpSpecToPHPUnit\Naming\PhpSpecRenaming;
use Rector\PhpSpecToPHPUnit\PHPUnitTypeDeclarationDecorator;
use Rector\PhpSpecToPHPUnit\Rector\AbstractPhpSpecToPHPUnitRector;
use Rector\Privatization\NodeManipulator\VisibilityManipulator;
/**
* @see \Rector\Tests\PhpSpecToPHPUnit\Rector\Variable\PhpSpecToPHPUnitRector\PhpSpecToPHPUnitRectorTest
*/
final class PhpSpecMethodToPHPUnitMethodRector extends \Rector\PhpSpecToPHPUnit\Rector\AbstractPhpSpecToPHPUnitRector
{
/**
* @readonly
* @var \Rector\PhpSpecToPHPUnit\PHPUnitTypeDeclarationDecorator
*/
private $phpUnitTypeDeclarationDecorator;
/**
* @readonly
* @var \Rector\PhpSpecToPHPUnit\Naming\PhpSpecRenaming
*/
private $phpSpecRenaming;
/**
* @readonly
* @var \Rector\Privatization\NodeManipulator\VisibilityManipulator
*/
private $visibilityManipulator;
public function __construct(\Rector\PhpSpecToPHPUnit\PHPUnitTypeDeclarationDecorator $phpUnitTypeDeclarationDecorator, \Rector\PhpSpecToPHPUnit\Naming\PhpSpecRenaming $phpSpecRenaming, \Rector\Privatization\NodeManipulator\VisibilityManipulator $visibilityManipulator)
{
$this->phpUnitTypeDeclarationDecorator = $phpUnitTypeDeclarationDecorator;
$this->phpSpecRenaming = $phpSpecRenaming;
$this->visibilityManipulator = $visibilityManipulator;
}
/**
* @return array<class-string<Node>>
*/
public function getNodeTypes() : array
{
return [\PhpParser\Node\Stmt\ClassMethod::class];
}
/**
* @param ClassMethod $node
*/
public function refactor(\PhpParser\Node $node) : ?\PhpParser\Node
{
if (!$this->isInPhpSpecBehavior($node)) {
return null;
}
if ($this->isName($node, 'letGo')) {
$node->name = new \PhpParser\Node\Identifier(\Rector\Core\ValueObject\MethodName::TEAR_DOWN);
$this->visibilityManipulator->makeProtected($node);
$this->phpUnitTypeDeclarationDecorator->decorate($node);
} elseif ($this->isName($node, 'let')) {
$node->name = new \PhpParser\Node\Identifier(\Rector\Core\ValueObject\MethodName::SET_UP);
$this->visibilityManipulator->makeProtected($node);
$this->phpUnitTypeDeclarationDecorator->decorate($node);
} elseif ($node->isPublic()) {
$this->processTestMethod($node);
} else {
return null;
}
return $node;
}
private function processTestMethod(\PhpParser\Node\Stmt\ClassMethod $classMethod) : void
{
// special case, @see https://johannespichler.com/writing-custom-phpspec-matchers/
if ($this->isName($classMethod, 'getMatchers')) {
return;
}
// change name to phpunit test case format
$this->phpSpecRenaming->renameMethod($classMethod);
// reorder instantiation + expected exception
$previousStmt = null;
foreach ((array) $classMethod->stmts as $key => $stmt) {
$printedStmtContent = $this->print($stmt);
if (\strpos($printedStmtContent, 'duringInstantiation') !== \false && $previousStmt instanceof \PhpParser\Node\Stmt) {
$printedPreviousStmt = $this->print($previousStmt);
if (\strpos($printedPreviousStmt, 'beConstructedThrough') !== \false) {
$classMethod->stmts[$key - 1] = $stmt;
$classMethod->stmts[$key] = $previousStmt;
}
}
$previousStmt = $stmt;
}
}
}

View File

@ -1,68 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\PhpSpecToPHPUnit\Rector\Class_;
use PhpParser\Node;
use PhpParser\Node\Stmt\Class_;
use PHPStan\Type\ObjectType;
use PHPStan\Type\UnionType;
use Rector\Core\NodeManipulator\ClassInsertManipulator;
use Rector\PhpSpecToPHPUnit\PhpSpecMockCollector;
use Rector\PhpSpecToPHPUnit\Rector\AbstractPhpSpecToPHPUnitRector;
/**
* @see \Rector\Tests\PhpSpecToPHPUnit\Rector\Variable\PhpSpecToPHPUnitRector\PhpSpecToPHPUnitRectorTest
*/
final class AddMockPropertiesRector extends \Rector\PhpSpecToPHPUnit\Rector\AbstractPhpSpecToPHPUnitRector
{
/**
* @readonly
* @var \Rector\Core\NodeManipulator\ClassInsertManipulator
*/
private $classInsertManipulator;
/**
* @readonly
* @var \Rector\PhpSpecToPHPUnit\PhpSpecMockCollector
*/
private $phpSpecMockCollector;
public function __construct(\Rector\Core\NodeManipulator\ClassInsertManipulator $classInsertManipulator, \Rector\PhpSpecToPHPUnit\PhpSpecMockCollector $phpSpecMockCollector)
{
$this->classInsertManipulator = $classInsertManipulator;
$this->phpSpecMockCollector = $phpSpecMockCollector;
}
/**
* @return array<class-string<Node>>
*/
public function getNodeTypes() : array
{
return [\PhpParser\Node\Stmt\Class_::class];
}
/**
* @param Class_ $node
*/
public function refactor(\PhpParser\Node $node) : ?\PhpParser\Node
{
if (!$this->isInPhpSpecBehavior($node)) {
return null;
}
$classMocks = $this->phpSpecMockCollector->resolveClassMocksFromParam($node);
$className = $this->getName($node);
if (!\is_string($className)) {
return null;
}
foreach ($classMocks as $name => $methods) {
if ((\is_array($methods) || $methods instanceof \Countable ? \count($methods) : 0) <= 1) {
continue;
}
// non-ctor used mocks are probably local only
if (!\in_array('let', $methods, \true)) {
continue;
}
$this->phpSpecMockCollector->addPropertyMock($className, $name);
$variableType = $this->phpSpecMockCollector->getTypeForClassAndVariable($node, $name);
$unionType = new \PHPStan\Type\UnionType([new \PHPStan\Type\ObjectType($variableType), new \PHPStan\Type\ObjectType('PHPUnit\\Framework\\MockObject\\MockObject')]);
$this->classInsertManipulator->addPropertyToClass($node, $name, $unionType);
}
return null;
}
}

View File

@ -1,149 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\PhpSpecToPHPUnit\Rector\Class_;
use PhpParser\Node;
use PhpParser\Node\Arg;
use PhpParser\Node\Expr\Assign;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Expr\New_;
use PhpParser\Node\Expr\PropertyFetch;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Name;
use PhpParser\Node\Stmt;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Expression;
use PHPStan\Type\ObjectType;
use Rector\Core\Exception\ShouldNotHappenException;
use Rector\Core\NodeManipulator\ClassInsertManipulator;
use Rector\PhpSpecToPHPUnit\LetManipulator;
use Rector\PhpSpecToPHPUnit\Naming\PhpSpecRenaming;
use Rector\PhpSpecToPHPUnit\Rector\AbstractPhpSpecToPHPUnitRector;
use Rector\PHPStanStaticTypeMapper\Enum\TypeKind;
use Rector\PHPUnit\NodeFactory\SetUpClassMethodFactory;
/**
* @see \Rector\Tests\PhpSpecToPHPUnit\Rector\Variable\PhpSpecToPHPUnitRector\PhpSpecToPHPUnitRectorTest
*/
final class PhpSpecClassToPHPUnitClassRector extends \Rector\PhpSpecToPHPUnit\Rector\AbstractPhpSpecToPHPUnitRector
{
/**
* @readonly
* @var \Rector\Core\NodeManipulator\ClassInsertManipulator
*/
private $classInsertManipulator;
/**
* @readonly
* @var \Rector\PhpSpecToPHPUnit\LetManipulator
*/
private $letManipulator;
/**
* @readonly
* @var \Rector\PhpSpecToPHPUnit\Naming\PhpSpecRenaming
*/
private $phpSpecRenaming;
/**
* @readonly
* @var \Rector\PHPUnit\NodeFactory\SetUpClassMethodFactory
*/
private $setUpClassMethodFactory;
public function __construct(\Rector\Core\NodeManipulator\ClassInsertManipulator $classInsertManipulator, \Rector\PhpSpecToPHPUnit\LetManipulator $letManipulator, \Rector\PhpSpecToPHPUnit\Naming\PhpSpecRenaming $phpSpecRenaming, \Rector\PHPUnit\NodeFactory\SetUpClassMethodFactory $setUpClassMethodFactory)
{
$this->classInsertManipulator = $classInsertManipulator;
$this->letManipulator = $letManipulator;
$this->phpSpecRenaming = $phpSpecRenaming;
$this->setUpClassMethodFactory = $setUpClassMethodFactory;
}
/**
* @return array<class-string<Node>>
*/
public function getNodeTypes() : array
{
return [\PhpParser\Node\Stmt\Class_::class];
}
/**
* @param Class_ $node
*/
public function refactor(\PhpParser\Node $node) : ?\PhpParser\Node
{
if (!$this->isInPhpSpecBehavior($node)) {
return null;
}
// 1. change namespace name to PHPUnit-like
$this->phpSpecRenaming->renameNamespace($node);
$propertyName = $this->phpSpecRenaming->resolveObjectPropertyName($node);
$this->phpSpecRenaming->renameClass($node);
$this->phpSpecRenaming->renameExtends($node);
$testedClass = $this->phpSpecRenaming->resolveTestedClass($node);
$testedObjectType = new \PHPStan\Type\ObjectType($testedClass);
$this->classInsertManipulator->addPropertyToClass($node, $propertyName, $testedObjectType);
$classMethod = $node->getMethod('let');
// add let if missing
if (!$classMethod instanceof \PhpParser\Node\Stmt\ClassMethod) {
if (!$this->letManipulator->isLetNeededInClass($node)) {
return null;
}
$letClassMethod = $this->createLetClassMethod($propertyName, $testedObjectType);
$this->classInsertManipulator->addAsFirstMethod($node, $letClassMethod);
}
return $this->removeSelfTypeMethod($node, $testedObjectType);
}
private function createLetClassMethod(string $propertyName, \PHPStan\Type\ObjectType $testedObjectType) : \PhpParser\Node\Stmt\ClassMethod
{
$propertyFetch = new \PhpParser\Node\Expr\PropertyFetch(new \PhpParser\Node\Expr\Variable('this'), $propertyName);
$testedObjectType = $this->staticTypeMapper->mapPHPStanTypeToPhpParserNode($testedObjectType, \Rector\PHPStanStaticTypeMapper\Enum\TypeKind::RETURN());
if (!$testedObjectType instanceof \PhpParser\Node\Name) {
throw new \Rector\Core\Exception\ShouldNotHappenException();
}
$new = new \PhpParser\Node\Expr\New_($testedObjectType);
$assign = new \PhpParser\Node\Expr\Assign($propertyFetch, $new);
return $this->setUpClassMethodFactory->createSetUpMethod([$assign]);
}
/**
* This is already checked on construction of object
*/
private function removeSelfTypeMethod(\PhpParser\Node\Stmt\Class_ $class, \PHPStan\Type\ObjectType $testedObjectType) : \PhpParser\Node\Stmt\Class_
{
foreach ($class->getMethods() as $classMethod) {
$classMethodStmts = (array) $classMethod->stmts;
if (\count($classMethodStmts) !== 1) {
continue;
}
$innerClassMethodStmt = $this->resolveFirstNonExpressionStmt($classMethodStmts);
if (!$innerClassMethodStmt instanceof \PhpParser\Node\Expr\MethodCall) {
continue;
}
if (!$this->isName($innerClassMethodStmt->name, 'shouldHaveType')) {
continue;
}
if (!isset($innerClassMethodStmt->args[0])) {
continue;
}
if (!$innerClassMethodStmt->args[0] instanceof \PhpParser\Node\Arg) {
continue;
}
// not the tested type
if (!$this->valueResolver->isValue($innerClassMethodStmt->args[0]->value, $testedObjectType->getClassName())) {
continue;
}
// remove it
$this->removeNodeFromStatements($class, $classMethod);
}
return $class;
}
/**
* @param Stmt[] $stmts
*/
private function resolveFirstNonExpressionStmt(array $stmts) : ?\PhpParser\Node
{
if (!isset($stmts[0])) {
return null;
}
$firstStmt = $stmts[0];
if ($firstStmt instanceof \PhpParser\Node\Stmt\Expression) {
return $firstStmt->expr;
}
return $firstStmt;
}
}

View File

@ -1,69 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\PhpSpecToPHPUnit\Rector\Class_;
use RectorPrefix20220303\Nette\Utils\Strings;
use PhpParser\Node;
use PhpParser\Node\Stmt\Class_;
use Rector\Core\Rector\AbstractRector;
use Rector\Core\Util\StringUtils;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
/**
* @changelog https://gnugat.github.io/2015/09/23/phpunit-with-phpspec.html
*
* @see \Rector\Tests\PhpSpecToPHPUnit\Rector\Class_\RenameSpecFileToTestFileRector\RenameSpecFileToTestFileRectorTest
*/
final class RenameSpecFileToTestFileRector extends \Rector\Core\Rector\AbstractRector
{
/**
* @var string
* @see https://regex101.com/r/r1VkPt/1
*/
private const SPEC_REGEX = '#\\/spec\\/#';
/**
* @var string
* @see https://regex101.com/r/WD4U43/1
*/
private const SPEC_SUFFIX_REGEX = '#Spec\\.php$#';
public function getRuleDefinition() : \Symplify\RuleDocGenerator\ValueObject\RuleDefinition
{
return new \Symplify\RuleDocGenerator\ValueObject\RuleDefinition('Rename "*Spec.php" file to "*Test.php" file', [new \Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample(<<<'CODE_SAMPLE'
// tests/SomeSpec.php
CODE_SAMPLE
, <<<'CODE_SAMPLE'
// tests/SomeTest.php
CODE_SAMPLE
)]);
}
/**
* @return array<class-string<Node>>
*/
public function getNodeTypes() : array
{
return [\PhpParser\Node\Stmt\Class_::class];
}
/**
* @param Class_ $node
*/
public function refactor(\PhpParser\Node $node) : ?\PhpParser\Node
{
$smartFileInfo = $this->file->getSmartFileInfo();
$oldPathname = $smartFileInfo->getPathname();
// ends with Spec.php
if (!\Rector\Core\Util\StringUtils::isMatch($oldPathname, self::SPEC_SUFFIX_REGEX)) {
return null;
}
$newPathName = $this->createPathName($oldPathname);
$this->removedAndAddedFilesCollector->addMovedFile($this->file, $newPathName);
return null;
}
private function createPathName(string $oldRealPath) : string
{
// suffix
$newRealPath = \RectorPrefix20220303\Nette\Utils\Strings::replace($oldRealPath, self::SPEC_SUFFIX_REGEX, 'Test.php');
// directory
return \RectorPrefix20220303\Nette\Utils\Strings::replace($newRealPath, self::SPEC_REGEX, '/tests/');
}
}

View File

@ -1,206 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\PhpSpecToPHPUnit\Rector\MethodCall;
use PhpParser\Comment\Doc;
use PhpParser\Node;
use PhpParser\Node\Arg;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\Assign;
use PhpParser\Node\Expr\ClassConstFetch;
use PhpParser\Node\Expr\Error;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Expr\PropertyFetch;
use PhpParser\Node\Expr\StaticCall;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Identifier;
use PhpParser\Node\Name;
use PhpParser\Node\Param;
use PhpParser\Node\Scalar\String_;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Expression;
use Rector\Core\Exception\ShouldNotHappenException;
use Rector\Core\Php\TypeAnalyzer;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\PhpSpecToPHPUnit\PhpSpecMockCollector;
use Rector\PhpSpecToPHPUnit\Rector\AbstractPhpSpecToPHPUnitRector;
/**
* @see \Rector\Tests\PhpSpecToPHPUnit\Rector\Variable\PhpSpecToPHPUnitRector\PhpSpecToPHPUnitRectorTest
*/
final class PhpSpecMocksToPHPUnitMocksRector extends \Rector\PhpSpecToPHPUnit\Rector\AbstractPhpSpecToPHPUnitRector
{
/**
* @readonly
* @var \Rector\PhpSpecToPHPUnit\PhpSpecMockCollector
*/
private $phpSpecMockCollector;
/**
* @readonly
* @var \Rector\Core\Php\TypeAnalyzer
*/
private $typeAnalyzer;
public function __construct(\Rector\PhpSpecToPHPUnit\PhpSpecMockCollector $phpSpecMockCollector, \Rector\Core\Php\TypeAnalyzer $typeAnalyzer)
{
$this->phpSpecMockCollector = $phpSpecMockCollector;
$this->typeAnalyzer = $typeAnalyzer;
}
/**
* @return array<class-string<Node>>
*/
public function getNodeTypes() : array
{
return [\PhpParser\Node\Stmt\ClassMethod::class, \PhpParser\Node\Expr\MethodCall::class];
}
/**
* @param ClassMethod|MethodCall $node
*/
public function refactor(\PhpParser\Node $node) : ?\PhpParser\Node
{
if (!$this->isInPhpSpecBehavior($node)) {
return null;
}
if ($node instanceof \PhpParser\Node\Stmt\ClassMethod) {
// public = tests, protected = internal, private = own (no framework magic)
if ($node->isPrivate()) {
return null;
}
$this->processMethodParamsToMocks($node);
return $node;
}
return $this->processMethodCall($node);
}
private function processMethodParamsToMocks(\PhpParser\Node\Stmt\ClassMethod $classMethod) : void
{
// remove params and turn them to instances
$assigns = [];
foreach ($classMethod->params as $param) {
if (!$param->type instanceof \PhpParser\Node\Name) {
throw new \Rector\Core\Exception\ShouldNotHappenException();
}
$createMockCall = $this->createCreateMockCall($param, $param->type);
if ($createMockCall !== null) {
$assigns[] = $createMockCall;
}
}
// remove all params
$classMethod->params = [];
$classMethod->stmts = \array_merge($assigns, (array) $classMethod->stmts);
}
private function processMethodCall(\PhpParser\Node\Expr\MethodCall $methodCall) : ?\PhpParser\Node\Expr\MethodCall
{
if (!$this->isName($methodCall->name, 'shouldBeCalled')) {
return null;
}
if (!$methodCall->var instanceof \PhpParser\Node\Expr\MethodCall) {
throw new \Rector\Core\Exception\ShouldNotHappenException();
}
$mockMethodName = $this->getName($methodCall->var->name);
if ($mockMethodName === null) {
throw new \Rector\Core\Exception\ShouldNotHappenException();
}
$arg = $methodCall->var->args[0] ?? null;
$expectedArg = $arg instanceof \PhpParser\Node\Arg ? $arg->value : null;
$methodCall->var->name = new \PhpParser\Node\Identifier('expects');
$thisOnceMethodCall = $this->nodeFactory->createLocalMethodCall('atLeastOnce');
$methodCall->var->args = [new \PhpParser\Node\Arg($thisOnceMethodCall)];
$methodCall->name = new \PhpParser\Node\Identifier('method');
$methodCall->args = [new \PhpParser\Node\Arg(new \PhpParser\Node\Scalar\String_($mockMethodName))];
if ($expectedArg !== null) {
return $this->appendWithMethodCall($methodCall, $expectedArg);
}
return $methodCall;
}
/**
* Variable or property fetch, based on number of present params in whole class
*/
private function createCreateMockCall(\PhpParser\Node\Param $param, \PhpParser\Node\Name $name) : ?\PhpParser\Node\Stmt\Expression
{
$class = $this->betterNodeFinder->findParentType($param, \PhpParser\Node\Stmt\Class_::class);
if (!$class instanceof \PhpParser\Node\Stmt\Class_) {
return null;
}
$classMocks = $this->phpSpecMockCollector->resolveClassMocksFromParam($class);
$variable = $this->getName($param->var);
$classMethod = $this->betterNodeFinder->findParentType($param, \PhpParser\Node\Stmt\ClassMethod::class);
if (!$classMethod instanceof \PhpParser\Node\Stmt\ClassMethod) {
throw new \Rector\Core\Exception\ShouldNotHappenException();
}
$methodName = $this->nodeNameResolver->getName($classMethod);
$methodsWithWThisMock = $classMocks[$variable];
if ($param->var instanceof \PhpParser\Node\Expr\Error) {
return null;
}
// single use: "$mock = $this->createMock()"
if (!$this->phpSpecMockCollector->isVariableMockInProperty($class, $param->var)) {
return $this->createNewMockVariableAssign($param, $name);
}
$reversedMethodsWithThisMock = \array_flip($methodsWithWThisMock);
// first use of many: "$this->mock = $this->createMock()"
if ($reversedMethodsWithThisMock[$methodName] === 0) {
return $this->createPropertyFetchMockVariableAssign($param, $name);
}
return null;
}
private function appendWithMethodCall(\PhpParser\Node\Expr\MethodCall $methodCall, \PhpParser\Node\Expr $expr) : \PhpParser\Node\Expr\MethodCall
{
$withMethodCall = new \PhpParser\Node\Expr\MethodCall($methodCall, 'with');
if ($expr instanceof \PhpParser\Node\Expr\StaticCall) {
if ($this->isName($expr->class, '*Argument')) {
if ($this->isName($expr->name, 'any')) {
// no added value having this method
return $methodCall;
}
if ($this->isName($expr->name, 'type')) {
$expr = $this->createIsTypeOrIsInstanceOf($expr);
}
}
} else {
$newExpr = $this->nodeFactory->createLocalMethodCall('equalTo');
$newExpr->args = [new \PhpParser\Node\Arg($expr)];
$expr = $newExpr;
}
$withMethodCall->args = [new \PhpParser\Node\Arg($expr)];
return $withMethodCall;
}
private function createNewMockVariableAssign(\PhpParser\Node\Param $param, \PhpParser\Node\Name $name) : \PhpParser\Node\Stmt\Expression
{
$methodCall = $this->nodeFactory->createLocalMethodCall('createMock');
$methodCall->args[] = new \PhpParser\Node\Arg(new \PhpParser\Node\Expr\ClassConstFetch($name, 'class'));
$assign = new \PhpParser\Node\Expr\Assign($param->var, $methodCall);
$assignExpression = new \PhpParser\Node\Stmt\Expression($assign);
// add @var doc comment
$varDoc = $this->createMockVarDoc($param, $name);
$assignExpression->setDocComment(new \PhpParser\Comment\Doc($varDoc));
return $assignExpression;
}
private function createPropertyFetchMockVariableAssign(\PhpParser\Node\Param $param, \PhpParser\Node\Name $name) : \PhpParser\Node\Stmt\Expression
{
$variable = $this->getName($param->var);
if ($variable === null) {
throw new \Rector\Core\Exception\ShouldNotHappenException();
}
$propertyFetch = new \PhpParser\Node\Expr\PropertyFetch(new \PhpParser\Node\Expr\Variable('this'), $variable);
$methodCall = $this->nodeFactory->createLocalMethodCall('createMock');
$methodCall->args[] = new \PhpParser\Node\Arg(new \PhpParser\Node\Expr\ClassConstFetch($name, 'class'));
$assign = new \PhpParser\Node\Expr\Assign($propertyFetch, $methodCall);
return new \PhpParser\Node\Stmt\Expression($assign);
}
private function createIsTypeOrIsInstanceOf(\PhpParser\Node\Expr\StaticCall $staticCall) : \PhpParser\Node\Expr\MethodCall
{
$args = $staticCall->args;
$type = $this->valueResolver->getValue($args[0]->value);
$name = $this->typeAnalyzer->isPhpReservedType($type) ? 'isType' : 'isInstanceOf';
return $this->nodeFactory->createLocalMethodCall($name, $args);
}
private function createMockVarDoc(\PhpParser\Node\Param $param, \PhpParser\Node\Name $name) : string
{
$paramType = (string) $name->getAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::ORIGINAL_NAME, $name);
$variableName = $this->getName($param->var);
if ($variableName === null) {
throw new \Rector\Core\Exception\ShouldNotHappenException();
}
return \sprintf('/** @var %s|\\%s $%s */', $paramType, 'PHPUnit\\Framework\\MockObject\\MockObject', $variableName);
}
}

View File

@ -1,275 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\PhpSpecToPHPUnit\Rector\MethodCall;
use PhpParser\Node;
use PhpParser\Node\Arg;
use PhpParser\Node\Expr\ArrayDimFetch;
use PhpParser\Node\Expr\Assign;
use PhpParser\Node\Expr\Clone_;
use PhpParser\Node\Expr\FuncCall;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Expr\PropertyFetch;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Identifier;
use PhpParser\Node\Scalar\String_;
use PhpParser\Node\Stmt\Class_;
use Rector\Core\Exception\ShouldNotHappenException;
use Rector\PhpSpecToPHPUnit\MatchersManipulator;
use Rector\PhpSpecToPHPUnit\Naming\PhpSpecRenaming;
use Rector\PhpSpecToPHPUnit\NodeFactory\AssertMethodCallFactory;
use Rector\PhpSpecToPHPUnit\NodeFactory\BeConstructedWithAssignFactory;
use Rector\PhpSpecToPHPUnit\NodeFactory\DuringMethodCallFactory;
use Rector\PhpSpecToPHPUnit\Rector\AbstractPhpSpecToPHPUnitRector;
/**
* @see \Rector\Tests\PhpSpecToPHPUnit\Rector\Variable\PhpSpecToPHPUnitRector\PhpSpecToPHPUnitRectorTest
*/
final class PhpSpecPromisesToPHPUnitAssertRector extends \Rector\PhpSpecToPHPUnit\Rector\AbstractPhpSpecToPHPUnitRector
{
/**
* @changelog https://github.com/phpspec/phpspec/blob/master/src/PhpSpec/Wrapper/Subject.php
*
* @changelog https://phpunit.readthedocs.io/en/8.0/assertions.html
* @var array<string, string[]>
*/
private const NEW_METHOD_TO_OLD_METHODS = [
'assertInstanceOf' => ['shouldBeAnInstanceOf', 'shouldHaveType', 'shouldReturnAnInstanceOf'],
'assertSame' => ['shouldBe', 'shouldReturn'],
'assertNotSame' => ['shouldNotBe', 'shouldNotReturn'],
'assertCount' => ['shouldHaveCount'],
'assertEquals' => ['shouldBeEqualTo', 'shouldEqual'],
'assertNotEquals' => ['shouldNotBeEqualTo'],
'assertContains' => ['shouldContain'],
'assertNotContains' => ['shouldNotContain'],
// types
'assertIsIterable' => ['shouldBeArray'],
'assertIsNotIterable' => ['shouldNotBeArray'],
'assertIsString' => ['shouldBeString'],
'assertIsNotString' => ['shouldNotBeString'],
'assertIsBool' => ['shouldBeBool', 'shouldBeBoolean'],
'assertIsNotBool' => ['shouldNotBeBool', 'shouldNotBeBoolean'],
'assertIsCallable' => ['shouldBeCallable'],
'assertIsNotCallable' => ['shouldNotBeCallable'],
'assertIsFloat' => ['shouldBeDouble', 'shouldBeFloat'],
'assertIsNotFloat' => ['shouldNotBeDouble', 'shouldNotBeFloat'],
'assertIsInt' => ['shouldBeInt', 'shouldBeInteger'],
'assertIsNotInt' => ['shouldNotBeInt', 'shouldNotBeInteger'],
'assertIsNull' => ['shouldBeNull'],
'assertIsNotNull' => ['shouldNotBeNull'],
'assertIsNumeric' => ['shouldBeNumeric'],
'assertIsNotNumeric' => ['shouldNotBeNumeric'],
'assertIsObject' => ['shouldBeObject'],
'assertIsNotObject' => ['shouldNotBeObject'],
'assertIsResource' => ['shouldBeResource'],
'assertIsNotResource' => ['shouldNotBeResource'],
'assertIsScalar' => ['shouldBeScalar'],
'assertIsNotScalar' => ['shouldNotBeScalar'],
'assertNan' => ['shouldBeNan'],
'assertFinite' => ['shouldBeFinite', 'shouldNotBeFinite'],
'assertInfinite' => ['shouldBeInfinite', 'shouldNotBeInfinite'],
];
/**
* @var string
*/
private const THIS = 'this';
/**
* @var string|null
*/
private $testedClass;
/**
* @var bool
*/
private $isPrepared = \false;
/**
* @var string[]
*/
private $matchersKeys = [];
/**
* @var \PhpParser\Node\Expr\PropertyFetch|null
*/
private $testedObjectPropertyFetch;
/**
* @readonly
* @var \Rector\PhpSpecToPHPUnit\MatchersManipulator
*/
private $matchersManipulator;
/**
* @readonly
* @var \Rector\PhpSpecToPHPUnit\Naming\PhpSpecRenaming
*/
private $phpSpecRenaming;
/**
* @readonly
* @var \Rector\PhpSpecToPHPUnit\NodeFactory\AssertMethodCallFactory
*/
private $assertMethodCallFactory;
/**
* @readonly
* @var \Rector\PhpSpecToPHPUnit\NodeFactory\BeConstructedWithAssignFactory
*/
private $beConstructedWithAssignFactory;
/**
* @readonly
* @var \Rector\PhpSpecToPHPUnit\NodeFactory\DuringMethodCallFactory
*/
private $duringMethodCallFactory;
public function __construct(\Rector\PhpSpecToPHPUnit\MatchersManipulator $matchersManipulator, \Rector\PhpSpecToPHPUnit\Naming\PhpSpecRenaming $phpSpecRenaming, \Rector\PhpSpecToPHPUnit\NodeFactory\AssertMethodCallFactory $assertMethodCallFactory, \Rector\PhpSpecToPHPUnit\NodeFactory\BeConstructedWithAssignFactory $beConstructedWithAssignFactory, \Rector\PhpSpecToPHPUnit\NodeFactory\DuringMethodCallFactory $duringMethodCallFactory)
{
$this->matchersManipulator = $matchersManipulator;
$this->phpSpecRenaming = $phpSpecRenaming;
$this->assertMethodCallFactory = $assertMethodCallFactory;
$this->beConstructedWithAssignFactory = $beConstructedWithAssignFactory;
$this->duringMethodCallFactory = $duringMethodCallFactory;
}
/**
* @return array<class-string<Node>>
*/
public function getNodeTypes() : array
{
return [\PhpParser\Node\Expr\MethodCall::class];
}
/**
* @param MethodCall $node
*/
public function refactor(\PhpParser\Node $node) : ?\PhpParser\Node
{
$this->isPrepared = \false;
$this->matchersKeys = [];
if (!$this->isInPhpSpecBehavior($node)) {
return null;
}
if ($this->isName($node->name, 'getWrappedObject')) {
return $node->var;
}
if ($this->isName($node->name, 'during')) {
return $this->duringMethodCallFactory->create($node, $this->getTestedObjectPropertyFetch());
}
if ($this->isName($node->name, 'duringInstantiation')) {
return $this->processDuringInstantiation($node);
}
// skip reserved names
if ($this->isNames($node->name, ['getMatchers', 'expectException', 'assert*'])) {
return null;
}
$this->prepareMethodCall($node);
if ($this->isName($node->name, 'beConstructed*')) {
return $this->beConstructedWithAssignFactory->create($node, $this->getTestedClass(), $this->getTestedObjectPropertyFetch());
}
$this->processMatchersKeys($node);
$args = $node->args;
foreach (self::NEW_METHOD_TO_OLD_METHODS as $newMethod => $oldMethods) {
if (!$this->isNames($node->name, $oldMethods)) {
continue;
}
return $this->assertMethodCallFactory->createAssertMethod($newMethod, $node->var, $args[0]->value ?? null, $this->getTestedObjectPropertyFetch());
}
if ($this->shouldSkip($node)) {
return null;
}
if ($this->isName($node->name, 'clone')) {
return new \PhpParser\Node\Expr\Clone_($this->getTestedObjectPropertyFetch());
}
$methodName = $this->getName($node->name);
if ($methodName === null) {
return null;
}
/** @var Class_ $classLike */
$classLike = $this->betterNodeFinder->findParentType($node, \PhpParser\Node\Stmt\Class_::class);
$classMethod = $classLike->getMethod($methodName);
// it's a method call, skip
if ($classMethod !== null) {
return null;
}
// direct PHPUnit method calls, no need to call on property
if (\in_array($methodName, ['atLeastOnce', 'equalTo', 'isInstanceOf', 'isType'], \true)) {
return $node;
}
$node->var = $this->getTestedObjectPropertyFetch();
return $node;
}
private function processDuringInstantiation(\PhpParser\Node\Expr\MethodCall $methodCall) : \PhpParser\Node\Expr\MethodCall
{
/** @var MethodCall $parentMethodCall */
$parentMethodCall = $methodCall->var;
$parentMethodCall->name = new \PhpParser\Node\Identifier('expectException');
return $parentMethodCall;
}
private function prepareMethodCall(\PhpParser\Node\Expr\MethodCall $methodCall) : void
{
if ($this->isPrepared) {
return;
}
$class = $this->betterNodeFinder->findParentType($methodCall, \PhpParser\Node\Stmt\Class_::class);
if (!$class instanceof \PhpParser\Node\Stmt\Class_) {
return;
}
$className = $this->getName($class);
if (!\is_string($className)) {
return;
}
$this->matchersKeys = $this->matchersManipulator->resolveMatcherNamesFromClass($class);
$this->testedClass = $this->phpSpecRenaming->resolveTestedClass($class);
$this->testedObjectPropertyFetch = $this->createTestedObjectPropertyFetch($class);
$this->isPrepared = \true;
}
private function getTestedObjectPropertyFetch() : \PhpParser\Node\Expr\PropertyFetch
{
if ($this->testedObjectPropertyFetch === null) {
throw new \Rector\Core\Exception\ShouldNotHappenException();
}
return $this->testedObjectPropertyFetch;
}
private function getTestedClass() : string
{
if ($this->testedClass === null) {
throw new \Rector\Core\Exception\ShouldNotHappenException();
}
return $this->testedClass;
}
/**
* @changelog https://johannespichler.com/writing-custom-phpspec-matchers/
*/
private function processMatchersKeys(\PhpParser\Node\Expr\MethodCall $methodCall) : void
{
foreach ($this->matchersKeys as $matcherKey) {
if (!$this->isName($methodCall->name, 'should' . \ucfirst($matcherKey))) {
continue;
}
if (!$methodCall->var instanceof \PhpParser\Node\Expr\MethodCall) {
continue;
}
// 1. assign callable to variable
$thisGetMatchers = $this->nodeFactory->createMethodCall(self::THIS, 'getMatchers');
$arrayDimFetch = new \PhpParser\Node\Expr\ArrayDimFetch($thisGetMatchers, new \PhpParser\Node\Scalar\String_($matcherKey));
$matcherCallableVariable = new \PhpParser\Node\Expr\Variable('matcherCallable');
$assign = new \PhpParser\Node\Expr\Assign($matcherCallableVariable, $arrayDimFetch);
// 2. call it on result
$funcCall = new \PhpParser\Node\Expr\FuncCall($matcherCallableVariable);
$funcCall->args = $methodCall->args;
$methodCall->name = $methodCall->var->name;
$methodCall->var = $this->getTestedObjectPropertyFetch();
$methodCall->args = [];
$funcCall->args[] = new \PhpParser\Node\Arg($methodCall);
$this->nodesToAddCollector->addNodesAfterNode([$assign, $funcCall], $methodCall);
$this->removeNode($methodCall);
return;
}
}
private function shouldSkip(\PhpParser\Node\Expr\MethodCall $methodCall) : bool
{
if (!$methodCall->var instanceof \PhpParser\Node\Expr\Variable) {
return \true;
}
if (!$this->nodeNameResolver->isName($methodCall->var, self::THIS)) {
return \true;
}
// skip "createMock" method
return $this->isName($methodCall->name, 'createMock');
}
private function createTestedObjectPropertyFetch(\PhpParser\Node\Stmt\Class_ $class) : \PhpParser\Node\Expr\PropertyFetch
{
$propertyName = $this->phpSpecRenaming->resolveObjectPropertyName($class);
return new \PhpParser\Node\Expr\PropertyFetch(new \PhpParser\Node\Expr\Variable(self::THIS), $propertyName);
}
}

View File

@ -1,56 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\PhpSpecToPHPUnit\Rector\Variable;
use PhpParser\Node;
use PhpParser\Node\Expr\PropertyFetch;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Stmt\Class_;
use Rector\PhpSpecToPHPUnit\PhpSpecMockCollector;
use Rector\PhpSpecToPHPUnit\Rector\AbstractPhpSpecToPHPUnitRector;
/**
* $mock->call()
*
* $this->mock->call()
*
* @see \Rector\Tests\PhpSpecToPHPUnit\Rector\Variable\PhpSpecToPHPUnitRector\PhpSpecToPHPUnitRectorTest
*/
final class MockVariableToPropertyFetchRector extends \Rector\PhpSpecToPHPUnit\Rector\AbstractPhpSpecToPHPUnitRector
{
/**
* @readonly
* @var \Rector\PhpSpecToPHPUnit\PhpSpecMockCollector
*/
private $phpSpecMockCollector;
public function __construct(\Rector\PhpSpecToPHPUnit\PhpSpecMockCollector $phpSpecMockCollector)
{
$this->phpSpecMockCollector = $phpSpecMockCollector;
}
/**
* @return array<class-string<Node>>
*/
public function getNodeTypes() : array
{
return [\PhpParser\Node\Expr\Variable::class];
}
/**
* @param Variable $node
*/
public function refactor(\PhpParser\Node $node) : ?\PhpParser\Node
{
$class = $this->betterNodeFinder->findParentType($node, \PhpParser\Node\Stmt\Class_::class);
if (!$class instanceof \PhpParser\Node\Stmt\Class_) {
return null;
}
if (!$this->isInPhpSpecBehavior($class)) {
return null;
}
if (!$this->phpSpecMockCollector->isVariableMockInProperty($class, $node)) {
return null;
}
/** @var string $variableName */
$variableName = $this->getName($node);
return new \PhpParser\Node\Expr\PropertyFetch(new \PhpParser\Node\Expr\Variable('this'), $variableName);
}
}

View File

@ -16,11 +16,11 @@ final class VersionResolver
/**
* @var string
*/
public const PACKAGE_VERSION = '320cdcd8dec579a3bb9a6138d1e50f72a22c0419';
public const PACKAGE_VERSION = 'e2cc867255a343411916b64db5d6daafe768573d';
/**
* @var string
*/
public const RELEASE_DATE = '2022-03-03 17:31:12';
public const RELEASE_DATE = '2022-03-03 20:51:15';
public static function resolvePackageVersion() : string
{
$process = new \RectorPrefix20220303\Symfony\Component\Process\Process(['git', 'log', '--pretty="%H"', '-n1', 'HEAD'], __DIR__);

View File

@ -1,43 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\Core\Php;
use RectorPrefix20220303\Nette\Utils\Strings;
use Rector\Core\ValueObject\PhpVersionFeature;
final class TypeAnalyzer
{
/**
* @var string[]
*/
private const EXTRA_TYPES = ['object'];
/**
* @var string
* @see https://regex101.com/r/57HGpC/1
*/
private const SQUARE_BRACKET_REGEX = '#(\\[\\])+$#';
/**
* @var string[]
*/
private $phpSupportedTypes = ['string', 'bool', 'int', 'null', 'array', 'false', 'true', 'mixed', 'iterable', 'float', 'self', 'parent', 'callable', 'void'];
public function __construct(\Rector\Core\Php\PhpVersionProvider $phpVersionProvider)
{
if ($phpVersionProvider->isAtLeastPhpVersion(\Rector\Core\ValueObject\PhpVersionFeature::OBJECT_TYPE)) {
$this->phpSupportedTypes[] = 'object';
}
}
public function isPhpReservedType(string $type) : bool
{
$types = \explode('|', $type);
$reservedTypes = \array_merge($this->phpSupportedTypes, self::EXTRA_TYPES);
foreach ($types as $type) {
$type = \strtolower($type);
// remove [] from arrays
$type = \RectorPrefix20220303\Nette\Utils\Strings::replace($type, self::SQUARE_BRACKET_REGEX, '');
if (\in_array($type, $reservedTypes, \true)) {
return \true;
}
}
return \false;
}
}

2
vendor/autoload.php vendored
View File

@ -4,4 +4,4 @@
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInitc291b87a1b4ce0b46a8e2f223b98b62f::getLoader();
return ComposerAutoloaderInitfed58148328b154b90a12011aecf4137::getLoader();

View File

@ -1191,6 +1191,7 @@ return array(
'RectorPrefix20220303\\Symplify\\Astral\\Reflection\\ReflectionParser' => $vendorDir . '/symplify/astral/src/Reflection/ReflectionParser.php',
'RectorPrefix20220303\\Symplify\\Astral\\StaticFactory\\NodeValueResolverStaticFactory' => $vendorDir . '/symplify/astral/src/StaticFactory/NodeValueResolverStaticFactory.php',
'RectorPrefix20220303\\Symplify\\Astral\\StaticFactory\\SimpleNameResolverStaticFactory' => $vendorDir . '/symplify/astral/src/StaticFactory/SimpleNameResolverStaticFactory.php',
'RectorPrefix20220303\\Symplify\\Astral\\TypeAnalyzer\\ClassMethodReturnTypeResolver' => $vendorDir . '/symplify/astral/src/TypeAnalyzer/ClassMethodReturnTypeResolver.php',
'RectorPrefix20220303\\Symplify\\Astral\\TypeAnalyzer\\ContainsTypeAnalyser' => $vendorDir . '/symplify/astral/src/TypeAnalyzer/ContainsTypeAnalyser.php',
'RectorPrefix20220303\\Symplify\\Astral\\ValueObject\\AstralConfig' => $vendorDir . '/symplify/astral/src/ValueObject/AstralConfig.php',
'RectorPrefix20220303\\Symplify\\Astral\\ValueObject\\AttributeKey' => $vendorDir . '/symplify/astral/src/ValueObject/AttributeKey.php',
@ -1759,7 +1760,6 @@ return array(
'Rector\\Core\\Php\\PhpVersionResolver\\ProjectComposerJsonPhpVersionResolver' => $baseDir . '/src/Php/PhpVersionResolver/ProjectComposerJsonPhpVersionResolver.php',
'Rector\\Core\\Php\\Regex\\RegexPatternArgumentManipulator' => $baseDir . '/src/Php/Regex/RegexPatternArgumentManipulator.php',
'Rector\\Core\\Php\\ReservedKeywordAnalyzer' => $baseDir . '/src/Php/ReservedKeywordAnalyzer.php',
'Rector\\Core\\Php\\TypeAnalyzer' => $baseDir . '/src/Php/TypeAnalyzer.php',
'Rector\\Core\\ProcessAnalyzer\\RectifiedAnalyzer' => $baseDir . '/src/ProcessAnalyzer/RectifiedAnalyzer.php',
'Rector\\Core\\Provider\\CurrentFileProvider' => $baseDir . '/src/Provider/CurrentFileProvider.php',
'Rector\\Core\\Rector\\AbstractRector' => $baseDir . '/src/Rector/AbstractRector.php',
@ -2472,6 +2472,8 @@ return array(
'Rector\\PHPUnit\\Naming\\TestClassNameResolver' => $vendorDir . '/rector/rector-phpunit/src/Naming/TestClassNameResolver.php',
'Rector\\PHPUnit\\NodeAnalyzer\\AssertCallAnalyzer' => $vendorDir . '/rector/rector-phpunit/src/NodeAnalyzer/AssertCallAnalyzer.php',
'Rector\\PHPUnit\\NodeAnalyzer\\IdentifierManipulator' => $vendorDir . '/rector/rector-phpunit/src/NodeAnalyzer/IdentifierManipulator.php',
'Rector\\PHPUnit\\NodeAnalyzer\\MockedVariableAnalyzer' => $vendorDir . '/rector/rector-phpunit/src/NodeAnalyzer/MockedVariableAnalyzer.php',
'Rector\\PHPUnit\\NodeAnalyzer\\SetUpMethodDecorator' => $vendorDir . '/rector/rector-phpunit/src/NodeAnalyzer/SetUpMethodDecorator.php',
'Rector\\PHPUnit\\NodeAnalyzer\\TestsNodeAnalyzer' => $vendorDir . '/rector/rector-phpunit/src/NodeAnalyzer/TestsNodeAnalyzer.php',
'Rector\\PHPUnit\\NodeFactory\\ArgumentShiftingFactory' => $vendorDir . '/rector/rector-phpunit/src/NodeFactory/ArgumentShiftingFactory.php',
'Rector\\PHPUnit\\NodeFactory\\AssertCallFactory' => $vendorDir . '/rector/rector-phpunit/src/NodeFactory/AssertCallFactory.php',
@ -2710,22 +2712,6 @@ return array(
'Rector\\PhpAttribute\\Printer\\PhpAttributeGroupFactory' => $baseDir . '/packages/PhpAttribute/Printer/PhpAttributeGroupFactory.php',
'Rector\\PhpAttribute\\RemovableAnnotationAnalyzer' => $baseDir . '/packages/PhpAttribute/RemovableAnnotationAnalyzer.php',
'Rector\\PhpAttribute\\UnwrapableAnnotationAnalyzer' => $baseDir . '/packages/PhpAttribute/UnwrapableAnnotationAnalyzer.php',
'Rector\\PhpSpecToPHPUnit\\LetManipulator' => $baseDir . '/rules/PhpSpecToPHPUnit/LetManipulator.php',
'Rector\\PhpSpecToPHPUnit\\MatchersManipulator' => $baseDir . '/rules/PhpSpecToPHPUnit/MatchersManipulator.php',
'Rector\\PhpSpecToPHPUnit\\Naming\\PhpSpecRenaming' => $baseDir . '/rules/PhpSpecToPHPUnit/Naming/PhpSpecRenaming.php',
'Rector\\PhpSpecToPHPUnit\\NodeFactory\\AssertMethodCallFactory' => $baseDir . '/rules/PhpSpecToPHPUnit/NodeFactory/AssertMethodCallFactory.php',
'Rector\\PhpSpecToPHPUnit\\NodeFactory\\BeConstructedWithAssignFactory' => $baseDir . '/rules/PhpSpecToPHPUnit/NodeFactory/BeConstructedWithAssignFactory.php',
'Rector\\PhpSpecToPHPUnit\\NodeFactory\\DuringMethodCallFactory' => $baseDir . '/rules/PhpSpecToPHPUnit/NodeFactory/DuringMethodCallFactory.php',
'Rector\\PhpSpecToPHPUnit\\PHPUnitTypeDeclarationDecorator' => $baseDir . '/rules/PhpSpecToPHPUnit/PHPUnitTypeDeclarationDecorator.php',
'Rector\\PhpSpecToPHPUnit\\PhpSpecMockCollector' => $baseDir . '/rules/PhpSpecToPHPUnit/PhpSpecMockCollector.php',
'Rector\\PhpSpecToPHPUnit\\Rector\\AbstractPhpSpecToPHPUnitRector' => $baseDir . '/rules/PhpSpecToPHPUnit/Rector/AbstractPhpSpecToPHPUnitRector.php',
'Rector\\PhpSpecToPHPUnit\\Rector\\ClassMethod\\PhpSpecMethodToPHPUnitMethodRector' => $baseDir . '/rules/PhpSpecToPHPUnit/Rector/ClassMethod/PhpSpecMethodToPHPUnitMethodRector.php',
'Rector\\PhpSpecToPHPUnit\\Rector\\Class_\\AddMockPropertiesRector' => $baseDir . '/rules/PhpSpecToPHPUnit/Rector/Class_/AddMockPropertiesRector.php',
'Rector\\PhpSpecToPHPUnit\\Rector\\Class_\\PhpSpecClassToPHPUnitClassRector' => $baseDir . '/rules/PhpSpecToPHPUnit/Rector/Class_/PhpSpecClassToPHPUnitClassRector.php',
'Rector\\PhpSpecToPHPUnit\\Rector\\Class_\\RenameSpecFileToTestFileRector' => $baseDir . '/rules/PhpSpecToPHPUnit/Rector/Class_/RenameSpecFileToTestFileRector.php',
'Rector\\PhpSpecToPHPUnit\\Rector\\MethodCall\\PhpSpecMocksToPHPUnitMocksRector' => $baseDir . '/rules/PhpSpecToPHPUnit/Rector/MethodCall/PhpSpecMocksToPHPUnitMocksRector.php',
'Rector\\PhpSpecToPHPUnit\\Rector\\MethodCall\\PhpSpecPromisesToPHPUnitAssertRector' => $baseDir . '/rules/PhpSpecToPHPUnit/Rector/MethodCall/PhpSpecPromisesToPHPUnitAssertRector.php',
'Rector\\PhpSpecToPHPUnit\\Rector\\Variable\\MockVariableToPropertyFetchRector' => $baseDir . '/rules/PhpSpecToPHPUnit/Rector/Variable/MockVariableToPropertyFetchRector.php',
'Rector\\PostRector\\Application\\PostFileProcessor' => $baseDir . '/packages/PostRector/Application/PostFileProcessor.php',
'Rector\\PostRector\\Collector\\NodesToAddCollector' => $baseDir . '/packages/PostRector/Collector/NodesToAddCollector.php',
'Rector\\PostRector\\Collector\\NodesToRemoveCollector' => $baseDir . '/packages/PostRector/Collector/NodesToRemoveCollector.php',

View File

@ -2,7 +2,7 @@
// autoload_real.php @generated by Composer
class ComposerAutoloaderInitc291b87a1b4ce0b46a8e2f223b98b62f
class ComposerAutoloaderInitfed58148328b154b90a12011aecf4137
{
private static $loader;
@ -22,15 +22,15 @@ class ComposerAutoloaderInitc291b87a1b4ce0b46a8e2f223b98b62f
return self::$loader;
}
spl_autoload_register(array('ComposerAutoloaderInitc291b87a1b4ce0b46a8e2f223b98b62f', 'loadClassLoader'), true, true);
spl_autoload_register(array('ComposerAutoloaderInitfed58148328b154b90a12011aecf4137', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
spl_autoload_unregister(array('ComposerAutoloaderInitc291b87a1b4ce0b46a8e2f223b98b62f', 'loadClassLoader'));
spl_autoload_unregister(array('ComposerAutoloaderInitfed58148328b154b90a12011aecf4137', 'loadClassLoader'));
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
if ($useStaticLoader) {
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInitc291b87a1b4ce0b46a8e2f223b98b62f::getInitializer($loader));
call_user_func(\Composer\Autoload\ComposerStaticInitfed58148328b154b90a12011aecf4137::getInitializer($loader));
} else {
$classMap = require __DIR__ . '/autoload_classmap.php';
if ($classMap) {
@ -42,12 +42,12 @@ class ComposerAutoloaderInitc291b87a1b4ce0b46a8e2f223b98b62f
$loader->register(true);
if ($useStaticLoader) {
$includeFiles = Composer\Autoload\ComposerStaticInitc291b87a1b4ce0b46a8e2f223b98b62f::$files;
$includeFiles = Composer\Autoload\ComposerStaticInitfed58148328b154b90a12011aecf4137::$files;
} else {
$includeFiles = require __DIR__ . '/autoload_files.php';
}
foreach ($includeFiles as $fileIdentifier => $file) {
composerRequirec291b87a1b4ce0b46a8e2f223b98b62f($fileIdentifier, $file);
composerRequirefed58148328b154b90a12011aecf4137($fileIdentifier, $file);
}
return $loader;
@ -59,7 +59,7 @@ class ComposerAutoloaderInitc291b87a1b4ce0b46a8e2f223b98b62f
* @param string $file
* @return void
*/
function composerRequirec291b87a1b4ce0b46a8e2f223b98b62f($fileIdentifier, $file)
function composerRequirefed58148328b154b90a12011aecf4137($fileIdentifier, $file)
{
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;

View File

@ -4,7 +4,7 @@
namespace Composer\Autoload;
class ComposerStaticInitc291b87a1b4ce0b46a8e2f223b98b62f
class ComposerStaticInitfed58148328b154b90a12011aecf4137
{
public static $files = array (
'320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
@ -1565,6 +1565,7 @@ class ComposerStaticInitc291b87a1b4ce0b46a8e2f223b98b62f
'RectorPrefix20220303\\Symplify\\Astral\\Reflection\\ReflectionParser' => __DIR__ . '/..' . '/symplify/astral/src/Reflection/ReflectionParser.php',
'RectorPrefix20220303\\Symplify\\Astral\\StaticFactory\\NodeValueResolverStaticFactory' => __DIR__ . '/..' . '/symplify/astral/src/StaticFactory/NodeValueResolverStaticFactory.php',
'RectorPrefix20220303\\Symplify\\Astral\\StaticFactory\\SimpleNameResolverStaticFactory' => __DIR__ . '/..' . '/symplify/astral/src/StaticFactory/SimpleNameResolverStaticFactory.php',
'RectorPrefix20220303\\Symplify\\Astral\\TypeAnalyzer\\ClassMethodReturnTypeResolver' => __DIR__ . '/..' . '/symplify/astral/src/TypeAnalyzer/ClassMethodReturnTypeResolver.php',
'RectorPrefix20220303\\Symplify\\Astral\\TypeAnalyzer\\ContainsTypeAnalyser' => __DIR__ . '/..' . '/symplify/astral/src/TypeAnalyzer/ContainsTypeAnalyser.php',
'RectorPrefix20220303\\Symplify\\Astral\\ValueObject\\AstralConfig' => __DIR__ . '/..' . '/symplify/astral/src/ValueObject/AstralConfig.php',
'RectorPrefix20220303\\Symplify\\Astral\\ValueObject\\AttributeKey' => __DIR__ . '/..' . '/symplify/astral/src/ValueObject/AttributeKey.php',
@ -2133,7 +2134,6 @@ class ComposerStaticInitc291b87a1b4ce0b46a8e2f223b98b62f
'Rector\\Core\\Php\\PhpVersionResolver\\ProjectComposerJsonPhpVersionResolver' => __DIR__ . '/../..' . '/src/Php/PhpVersionResolver/ProjectComposerJsonPhpVersionResolver.php',
'Rector\\Core\\Php\\Regex\\RegexPatternArgumentManipulator' => __DIR__ . '/../..' . '/src/Php/Regex/RegexPatternArgumentManipulator.php',
'Rector\\Core\\Php\\ReservedKeywordAnalyzer' => __DIR__ . '/../..' . '/src/Php/ReservedKeywordAnalyzer.php',
'Rector\\Core\\Php\\TypeAnalyzer' => __DIR__ . '/../..' . '/src/Php/TypeAnalyzer.php',
'Rector\\Core\\ProcessAnalyzer\\RectifiedAnalyzer' => __DIR__ . '/../..' . '/src/ProcessAnalyzer/RectifiedAnalyzer.php',
'Rector\\Core\\Provider\\CurrentFileProvider' => __DIR__ . '/../..' . '/src/Provider/CurrentFileProvider.php',
'Rector\\Core\\Rector\\AbstractRector' => __DIR__ . '/../..' . '/src/Rector/AbstractRector.php',
@ -2846,6 +2846,8 @@ class ComposerStaticInitc291b87a1b4ce0b46a8e2f223b98b62f
'Rector\\PHPUnit\\Naming\\TestClassNameResolver' => __DIR__ . '/..' . '/rector/rector-phpunit/src/Naming/TestClassNameResolver.php',
'Rector\\PHPUnit\\NodeAnalyzer\\AssertCallAnalyzer' => __DIR__ . '/..' . '/rector/rector-phpunit/src/NodeAnalyzer/AssertCallAnalyzer.php',
'Rector\\PHPUnit\\NodeAnalyzer\\IdentifierManipulator' => __DIR__ . '/..' . '/rector/rector-phpunit/src/NodeAnalyzer/IdentifierManipulator.php',
'Rector\\PHPUnit\\NodeAnalyzer\\MockedVariableAnalyzer' => __DIR__ . '/..' . '/rector/rector-phpunit/src/NodeAnalyzer/MockedVariableAnalyzer.php',
'Rector\\PHPUnit\\NodeAnalyzer\\SetUpMethodDecorator' => __DIR__ . '/..' . '/rector/rector-phpunit/src/NodeAnalyzer/SetUpMethodDecorator.php',
'Rector\\PHPUnit\\NodeAnalyzer\\TestsNodeAnalyzer' => __DIR__ . '/..' . '/rector/rector-phpunit/src/NodeAnalyzer/TestsNodeAnalyzer.php',
'Rector\\PHPUnit\\NodeFactory\\ArgumentShiftingFactory' => __DIR__ . '/..' . '/rector/rector-phpunit/src/NodeFactory/ArgumentShiftingFactory.php',
'Rector\\PHPUnit\\NodeFactory\\AssertCallFactory' => __DIR__ . '/..' . '/rector/rector-phpunit/src/NodeFactory/AssertCallFactory.php',
@ -3084,22 +3086,6 @@ class ComposerStaticInitc291b87a1b4ce0b46a8e2f223b98b62f
'Rector\\PhpAttribute\\Printer\\PhpAttributeGroupFactory' => __DIR__ . '/../..' . '/packages/PhpAttribute/Printer/PhpAttributeGroupFactory.php',
'Rector\\PhpAttribute\\RemovableAnnotationAnalyzer' => __DIR__ . '/../..' . '/packages/PhpAttribute/RemovableAnnotationAnalyzer.php',
'Rector\\PhpAttribute\\UnwrapableAnnotationAnalyzer' => __DIR__ . '/../..' . '/packages/PhpAttribute/UnwrapableAnnotationAnalyzer.php',
'Rector\\PhpSpecToPHPUnit\\LetManipulator' => __DIR__ . '/../..' . '/rules/PhpSpecToPHPUnit/LetManipulator.php',
'Rector\\PhpSpecToPHPUnit\\MatchersManipulator' => __DIR__ . '/../..' . '/rules/PhpSpecToPHPUnit/MatchersManipulator.php',
'Rector\\PhpSpecToPHPUnit\\Naming\\PhpSpecRenaming' => __DIR__ . '/../..' . '/rules/PhpSpecToPHPUnit/Naming/PhpSpecRenaming.php',
'Rector\\PhpSpecToPHPUnit\\NodeFactory\\AssertMethodCallFactory' => __DIR__ . '/../..' . '/rules/PhpSpecToPHPUnit/NodeFactory/AssertMethodCallFactory.php',
'Rector\\PhpSpecToPHPUnit\\NodeFactory\\BeConstructedWithAssignFactory' => __DIR__ . '/../..' . '/rules/PhpSpecToPHPUnit/NodeFactory/BeConstructedWithAssignFactory.php',
'Rector\\PhpSpecToPHPUnit\\NodeFactory\\DuringMethodCallFactory' => __DIR__ . '/../..' . '/rules/PhpSpecToPHPUnit/NodeFactory/DuringMethodCallFactory.php',
'Rector\\PhpSpecToPHPUnit\\PHPUnitTypeDeclarationDecorator' => __DIR__ . '/../..' . '/rules/PhpSpecToPHPUnit/PHPUnitTypeDeclarationDecorator.php',
'Rector\\PhpSpecToPHPUnit\\PhpSpecMockCollector' => __DIR__ . '/../..' . '/rules/PhpSpecToPHPUnit/PhpSpecMockCollector.php',
'Rector\\PhpSpecToPHPUnit\\Rector\\AbstractPhpSpecToPHPUnitRector' => __DIR__ . '/../..' . '/rules/PhpSpecToPHPUnit/Rector/AbstractPhpSpecToPHPUnitRector.php',
'Rector\\PhpSpecToPHPUnit\\Rector\\ClassMethod\\PhpSpecMethodToPHPUnitMethodRector' => __DIR__ . '/../..' . '/rules/PhpSpecToPHPUnit/Rector/ClassMethod/PhpSpecMethodToPHPUnitMethodRector.php',
'Rector\\PhpSpecToPHPUnit\\Rector\\Class_\\AddMockPropertiesRector' => __DIR__ . '/../..' . '/rules/PhpSpecToPHPUnit/Rector/Class_/AddMockPropertiesRector.php',
'Rector\\PhpSpecToPHPUnit\\Rector\\Class_\\PhpSpecClassToPHPUnitClassRector' => __DIR__ . '/../..' . '/rules/PhpSpecToPHPUnit/Rector/Class_/PhpSpecClassToPHPUnitClassRector.php',
'Rector\\PhpSpecToPHPUnit\\Rector\\Class_\\RenameSpecFileToTestFileRector' => __DIR__ . '/../..' . '/rules/PhpSpecToPHPUnit/Rector/Class_/RenameSpecFileToTestFileRector.php',
'Rector\\PhpSpecToPHPUnit\\Rector\\MethodCall\\PhpSpecMocksToPHPUnitMocksRector' => __DIR__ . '/../..' . '/rules/PhpSpecToPHPUnit/Rector/MethodCall/PhpSpecMocksToPHPUnitMocksRector.php',
'Rector\\PhpSpecToPHPUnit\\Rector\\MethodCall\\PhpSpecPromisesToPHPUnitAssertRector' => __DIR__ . '/../..' . '/rules/PhpSpecToPHPUnit/Rector/MethodCall/PhpSpecPromisesToPHPUnitAssertRector.php',
'Rector\\PhpSpecToPHPUnit\\Rector\\Variable\\MockVariableToPropertyFetchRector' => __DIR__ . '/../..' . '/rules/PhpSpecToPHPUnit/Rector/Variable/MockVariableToPropertyFetchRector.php',
'Rector\\PostRector\\Application\\PostFileProcessor' => __DIR__ . '/../..' . '/packages/PostRector/Application/PostFileProcessor.php',
'Rector\\PostRector\\Collector\\NodesToAddCollector' => __DIR__ . '/../..' . '/packages/PostRector/Collector/NodesToAddCollector.php',
'Rector\\PostRector\\Collector\\NodesToRemoveCollector' => __DIR__ . '/../..' . '/packages/PostRector/Collector/NodesToRemoveCollector.php',
@ -3845,9 +3831,9 @@ class ComposerStaticInitc291b87a1b4ce0b46a8e2f223b98b62f
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInitc291b87a1b4ce0b46a8e2f223b98b62f::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInitc291b87a1b4ce0b46a8e2f223b98b62f::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInitc291b87a1b4ce0b46a8e2f223b98b62f::$classMap;
$loader->prefixLengthsPsr4 = ComposerStaticInitfed58148328b154b90a12011aecf4137::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInitfed58148328b154b90a12011aecf4137::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInitfed58148328b154b90a12011aecf4137::$classMap;
}, null, ClassLoader::class);
}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -9,7 +9,7 @@ namespace Rector\RectorInstaller;
*/
final class GeneratedConfig
{
public const EXTENSIONS = array('rector/rector-cakephp' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-cakephp', 'relative_install_path' => '../../rector-cakephp', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main d1fa93d'), 'rector/rector-doctrine' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-doctrine', 'relative_install_path' => '../../rector-doctrine', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main 9cc03db'), 'rector/rector-generator' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-generator', 'relative_install_path' => '../../rector-generator', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main df58e86'), 'rector/rector-laravel' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-laravel', 'relative_install_path' => '../../rector-laravel', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main 6bee428'), 'rector/rector-nette' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-nette', 'relative_install_path' => '../../rector-nette', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main fbfa93c'), 'rector/rector-phpoffice' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-phpoffice', 'relative_install_path' => '../../rector-phpoffice', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main f23c4bf'), 'rector/rector-phpunit' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-phpunit', 'relative_install_path' => '../../rector-phpunit', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main 139b5da'), 'rector/rector-symfony' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-symfony', 'relative_install_path' => '../../rector-symfony', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main 5c1486a'), 'ssch/typo3-rector' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/ssch/typo3-rector', 'relative_install_path' => '../../../ssch/typo3-rector', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main 983908f'));
public const EXTENSIONS = array('rector/rector-cakephp' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-cakephp', 'relative_install_path' => '../../rector-cakephp', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main d1fa93d'), 'rector/rector-doctrine' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-doctrine', 'relative_install_path' => '../../rector-doctrine', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main 9cc03db'), 'rector/rector-generator' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-generator', 'relative_install_path' => '../../rector-generator', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main df58e86'), 'rector/rector-laravel' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-laravel', 'relative_install_path' => '../../rector-laravel', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main 6bee428'), 'rector/rector-nette' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-nette', 'relative_install_path' => '../../rector-nette', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main fbfa93c'), 'rector/rector-phpoffice' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-phpoffice', 'relative_install_path' => '../../rector-phpoffice', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main f23c4bf'), 'rector/rector-phpunit' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-phpunit', 'relative_install_path' => '../../rector-phpunit', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main 5952218'), 'rector/rector-symfony' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-symfony', 'relative_install_path' => '../../rector-symfony', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main 5c1486a'), 'ssch/typo3-rector' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/ssch/typo3-rector', 'relative_install_path' => '../../../ssch/typo3-rector', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main 983908f'));
private function __construct()
{
}

View File

@ -30,8 +30,8 @@ return static function (\Symfony\Component\DependencyInjection\Loader\Configurat
$services = $containerConfigurator->services();
$services->set(\Rector\Php55\Rector\String_\StringClassNameToClassConstantRector::class)->configure([
// keep unprefixed to protected from downgrade
'PHPUnit\\Framework\\MockObject\\MockBuilder',
'PHPUnit\\Framework\\MockObject\\MockObject',
'PHPUnit\\Framework\\MockObject\\*',
'PHPUnit\\Framework\\TestCase',
'Prophecy\\Prophet',
]);
};

View File

@ -0,0 +1,49 @@
<?php
declare (strict_types=1);
namespace Rector\PHPUnit\NodeAnalyzer;
use PhpParser\Node;
use PhpParser\Node\Expr\PropertyFetch;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\Type\MixedType;
use PHPStan\Type\ObjectType;
use Rector\NodeTypeResolver\NodeTypeResolver;
use RectorPrefix20220303\Symplify\Astral\NodeTraverser\SimpleCallableNodeTraverser;
final class MockedVariableAnalyzer
{
/**
* @readonly
* @var \Symplify\Astral\NodeTraverser\SimpleCallableNodeTraverser
*/
private $simpleCallableNodeTraverser;
/**
* @readonly
* @var \Rector\NodeTypeResolver\NodeTypeResolver
*/
private $nodeTypeResolver;
public function __construct(\RectorPrefix20220303\Symplify\Astral\NodeTraverser\SimpleCallableNodeTraverser $simpleCallableNodeTraverser, \Rector\NodeTypeResolver\NodeTypeResolver $nodeTypeResolver)
{
$this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser;
$this->nodeTypeResolver = $nodeTypeResolver;
}
public function containsMockAsUsedVariable(\PhpParser\Node\Stmt\ClassMethod $classMethod) : bool
{
$doesContainMock = \false;
$this->simpleCallableNodeTraverser->traverseNodesWithCallable($classMethod, function (\PhpParser\Node $node) use(&$doesContainMock) {
if (!$node instanceof \PhpParser\Node\Expr\PropertyFetch && !$node instanceof \PhpParser\Node\Expr\Variable) {
return null;
}
$variableType = $this->nodeTypeResolver->getType($node);
if ($variableType instanceof \PHPStan\Type\MixedType) {
return null;
}
if ($variableType->isSuperTypeOf(new \PHPStan\Type\ObjectType('PHPUnit\\Framework\\MockObject\\MockObject'))->yes()) {
$doesContainMock = \true;
}
return null;
});
return $doesContainMock;
}
}

View File

@ -1,7 +1,7 @@
<?php
declare (strict_types=1);
namespace Rector\PhpSpecToPHPUnit;
namespace Rector\PHPUnit\NodeAnalyzer;
use PhpParser\Node\Stmt\ClassMethod;
use Rector\Core\PhpParser\AstResolver;
@ -10,7 +10,7 @@ use Rector\Testing\PHPUnit\StaticPHPUnitEnvironment;
/**
* Decorate setUp() and tearDown() with "void" when local TestClass class uses them
*/
final class PHPUnitTypeDeclarationDecorator
final class SetUpMethodDecorator
{
/**
* @readonly

View File

@ -10,16 +10,16 @@ use PhpParser\Node\Stmt\Expression;
use Rector\Core\Enum\ObjectReference;
use Rector\Core\PhpParser\Node\NodeFactory;
use Rector\Core\ValueObject\MethodName;
use Rector\PhpSpecToPHPUnit\PHPUnitTypeDeclarationDecorator;
use Rector\PHPUnit\NodeAnalyzer\SetUpMethodDecorator;
use Rector\PHPUnit\NodeManipulator\StmtManipulator;
use RectorPrefix20220303\Symplify\Astral\ValueObject\NodeBuilder\MethodBuilder;
final class SetUpClassMethodFactory
{
/**
* @readonly
* @var \Rector\PhpSpecToPHPUnit\PHPUnitTypeDeclarationDecorator
* @var \Rector\PHPUnit\NodeAnalyzer\SetUpMethodDecorator
*/
private $phpUnitTypeDeclarationDecorator;
private $setUpMethodDecorator;
/**
* @readonly
* @var \Rector\PHPUnit\NodeManipulator\StmtManipulator
@ -30,9 +30,9 @@ final class SetUpClassMethodFactory
* @var \Rector\Core\PhpParser\Node\NodeFactory
*/
private $nodeFactory;
public function __construct(\Rector\PhpSpecToPHPUnit\PHPUnitTypeDeclarationDecorator $phpUnitTypeDeclarationDecorator, \Rector\PHPUnit\NodeManipulator\StmtManipulator $stmtManipulator, \Rector\Core\PhpParser\Node\NodeFactory $nodeFactory)
public function __construct(\Rector\PHPUnit\NodeAnalyzer\SetUpMethodDecorator $setUpMethodDecorator, \Rector\PHPUnit\NodeManipulator\StmtManipulator $stmtManipulator, \Rector\Core\PhpParser\Node\NodeFactory $nodeFactory)
{
$this->phpUnitTypeDeclarationDecorator = $phpUnitTypeDeclarationDecorator;
$this->setUpMethodDecorator = $setUpMethodDecorator;
$this->stmtManipulator = $stmtManipulator;
$this->nodeFactory = $nodeFactory;
}
@ -47,7 +47,7 @@ final class SetUpClassMethodFactory
$classMethodBuilder->addStmt($this->createParentStaticCall());
$classMethodBuilder->addStmts($stmts);
$classMethod = $classMethodBuilder->getNode();
$this->phpUnitTypeDeclarationDecorator->decorate($classMethod);
$this->setUpMethodDecorator->decorate($classMethod);
return $classMethod;
}
public function createParentStaticCall() : \PhpParser\Node\Stmt\Expression

View File

@ -4,15 +4,12 @@ declare (strict_types=1);
namespace Rector\PHPUnit\Rector\ClassMethod;
use PhpParser\Node;
use PhpParser\Node\Expr\PropertyFetch;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode;
use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode;
use PHPStan\Type\MixedType;
use PHPStan\Type\ObjectType;
use Rector\Core\Rector\AbstractRector;
use Rector\PHPUnit\NodeAnalyzer\AssertCallAnalyzer;
use Rector\PHPUnit\NodeAnalyzer\MockedVariableAnalyzer;
use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
@ -34,10 +31,16 @@ final class AddDoesNotPerformAssertionToNonAssertingTestRector extends \Rector\C
* @var \Rector\PHPUnit\NodeAnalyzer\AssertCallAnalyzer
*/
private $assertCallAnalyzer;
public function __construct(\Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer $testsNodeAnalyzer, \Rector\PHPUnit\NodeAnalyzer\AssertCallAnalyzer $assertCallAnalyzer)
/**
* @readonly
* @var \Rector\PHPUnit\NodeAnalyzer\MockedVariableAnalyzer
*/
private $mockedVariableAnalyzer;
public function __construct(\Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer $testsNodeAnalyzer, \Rector\PHPUnit\NodeAnalyzer\AssertCallAnalyzer $assertCallAnalyzer, \Rector\PHPUnit\NodeAnalyzer\MockedVariableAnalyzer $mockedVariableAnalyzer)
{
$this->testsNodeAnalyzer = $testsNodeAnalyzer;
$this->assertCallAnalyzer = $assertCallAnalyzer;
$this->mockedVariableAnalyzer = $mockedVariableAnalyzer;
}
public function getRuleDefinition() : \Symplify\RuleDocGenerator\ValueObject\RuleDefinition
{
@ -102,29 +105,11 @@ CODE_SAMPLE
if ($this->assertCallAnalyzer->containsAssertCall($classMethod)) {
return \true;
}
return $this->containsMockAsUsedVariable($classMethod);
return $this->mockedVariableAnalyzer->containsMockAsUsedVariable($classMethod);
}
private function addDoesNotPerformAssertions(\PhpParser\Node\Stmt\ClassMethod $classMethod) : void
{
$phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($classMethod);
$phpDocInfo->addPhpDocTagNode(new \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode('@doesNotPerformAssertions', new \PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode('')));
}
private function containsMockAsUsedVariable(\PhpParser\Node\Stmt\ClassMethod $classMethod) : bool
{
$doesContainMock = \false;
$this->traverseNodesWithCallable($classMethod, function (\PhpParser\Node $node) use(&$doesContainMock) {
if (!$node instanceof \PhpParser\Node\Expr\PropertyFetch && !$node instanceof \PhpParser\Node\Expr\Variable) {
return null;
}
$variableType = $this->getType($node);
if ($variableType instanceof \PHPStan\Type\MixedType) {
return null;
}
if ($variableType->isSuperTypeOf(new \PHPStan\Type\ObjectType('PHPUnit\\Framework\\MockObject\\MockObject'))->yes()) {
$doesContainMock = \true;
}
return null;
});
return $doesContainMock;
}
}

View File

@ -9,8 +9,8 @@ $loader = require_once __DIR__.'/autoload.php';
if (!class_exists('AutoloadIncluder', false) && !interface_exists('AutoloadIncluder', false) && !trait_exists('AutoloadIncluder', false)) {
spl_autoload_call('RectorPrefix20220303\AutoloadIncluder');
}
if (!class_exists('ComposerAutoloaderInitc291b87a1b4ce0b46a8e2f223b98b62f', false) && !interface_exists('ComposerAutoloaderInitc291b87a1b4ce0b46a8e2f223b98b62f', false) && !trait_exists('ComposerAutoloaderInitc291b87a1b4ce0b46a8e2f223b98b62f', false)) {
spl_autoload_call('RectorPrefix20220303\ComposerAutoloaderInitc291b87a1b4ce0b46a8e2f223b98b62f');
if (!class_exists('ComposerAutoloaderInitfed58148328b154b90a12011aecf4137', false) && !interface_exists('ComposerAutoloaderInitfed58148328b154b90a12011aecf4137', false) && !trait_exists('ComposerAutoloaderInitfed58148328b154b90a12011aecf4137', false)) {
spl_autoload_call('RectorPrefix20220303\ComposerAutoloaderInitfed58148328b154b90a12011aecf4137');
}
if (!class_exists('Helmich\TypoScriptParser\Parser\AST\Statement', false) && !interface_exists('Helmich\TypoScriptParser\Parser\AST\Statement', false) && !trait_exists('Helmich\TypoScriptParser\Parser\AST\Statement', false)) {
spl_autoload_call('RectorPrefix20220303\Helmich\TypoScriptParser\Parser\AST\Statement');
@ -59,9 +59,9 @@ if (!function_exists('print_node')) {
return \RectorPrefix20220303\print_node(...func_get_args());
}
}
if (!function_exists('composerRequirec291b87a1b4ce0b46a8e2f223b98b62f')) {
function composerRequirec291b87a1b4ce0b46a8e2f223b98b62f() {
return \RectorPrefix20220303\composerRequirec291b87a1b4ce0b46a8e2f223b98b62f(...func_get_args());
if (!function_exists('composerRequirefed58148328b154b90a12011aecf4137')) {
function composerRequirefed58148328b154b90a12011aecf4137() {
return \RectorPrefix20220303\composerRequirefed58148328b154b90a12011aecf4137(...func_get_args());
}
}
if (!function_exists('scanPath')) {

View File

@ -7,16 +7,16 @@
"php": ">=8.0",
"nette\/utils": "^3.2",
"symfony\/dependency-injection": "^5.4|^6.0",
"symplify\/smart-file-system": "^10.1",
"symplify\/smart-file-system": "^10.1.1",
"phpstan\/phpstan": "^1.4.6",
"phpstan\/phpdoc-parser": "^1.2",
"symfony\/config": "^5.4|^6.0",
"nikic\/php-parser": "^4.13.2",
"symplify\/package-builder": "^10.1",
"symplify\/symplify-kernel": "^10.1"
"symplify\/package-builder": "^10.1.1",
"symplify\/symplify-kernel": "^10.1.1"
},
"require-dev": {
"symplify\/easy-testing": "^10.1",
"symplify\/easy-testing": "^10.1.1",
"phpunit\/phpunit": "^9.5"
},
"autoload": {
@ -31,7 +31,7 @@
},
"extra": {
"branch-alias": {
"dev-main": "10.1-dev"
"dev-main": "10.2-dev"
},
"phpstan": {
"includes": [
@ -40,32 +40,31 @@
}
},
"conflict": {
"symplify\/composer-json-manipulator": "<10.1.0",
"symplify\/easy-coding-standard": "<10.1.0",
"symplify\/phpstan-rules": "<10.1.0",
"symplify\/easy-testing": "<10.1.0",
"symplify\/rule-doc-generator-contracts": "<10.1.0",
"symplify\/php-config-printer": "<10.1.0",
"symplify\/markdown-diff": "<10.1.0",
"symplify\/amnesia": "<10.1.0",
"symplify\/phpstan-extensions": "<10.1.0",
"symplify\/rule-doc-generator": "<10.1.0",
"symplify\/vendor-patches": "<10.1.0",
"symplify\/skipper": "<10.1.0",
"symplify\/composer-json-manipulator": "<10.1.1",
"symplify\/easy-coding-standard": "<10.1.1",
"symplify\/phpstan-rules": "<10.1.1",
"symplify\/easy-testing": "<10.1.1",
"symplify\/rule-doc-generator-contracts": "<10.1.1",
"symplify\/php-config-printer": "<10.1.1",
"symplify\/amnesia": "<10.1.1",
"symplify\/phpstan-extensions": "<10.1.1",
"symplify\/rule-doc-generator": "<10.1.1",
"symplify\/vendor-patches": "<10.1.1",
"symplify\/skipper": "<10.1.1",
"symplify\/smart-file-system": "<9.4.70",
"symplify\/symfony-static-dumper": "<10.1.0",
"symplify\/git-wrapper": "<10.1.0",
"symplify\/symfony-static-dumper": "<10.1.1",
"symplify\/git-wrapper": "<10.1.1",
"symplify\/symplify-kernel": "<9.4.70",
"symplify\/monorepo-builder": "<10.1.0",
"symplify\/config-transformer": "<10.1.0",
"symplify\/easy-ci": "<10.1.0",
"symplify\/coding-standard": "<10.1.0",
"symplify\/latte-phpstan-compiler": "<10.1.0",
"symplify\/template-phpstan-compiler": "<10.1.0",
"symplify\/phpstan-latte-rules": "<10.1.0",
"symplify\/autowire-array-parameter": "<10.1.0",
"symplify\/easy-parallel": "<10.1.0",
"symplify\/neon-config-dumper": "<10.1.0"
"symplify\/monorepo-builder": "<10.1.1",
"symplify\/config-transformer": "<10.1.1",
"symplify\/easy-ci": "<10.1.1",
"symplify\/coding-standard": "<10.1.1",
"symplify\/latte-phpstan-compiler": "<10.1.1",
"symplify\/template-phpstan-compiler": "<10.1.1",
"symplify\/phpstan-latte-rules": "<10.1.1",
"symplify\/autowire-array-parameter": "<10.1.1",
"symplify\/easy-parallel": "<10.1.1",
"symplify\/neon-config-dumper": "<10.1.1"
},
"minimum-stability": "dev",
"prefer-stable": true

View File

@ -25,3 +25,4 @@ services:
- Symplify\Astral\NodeTraverser\SimpleCallableNodeTraverser
- Symplify\Astral\TypeAnalyzer\ContainsTypeAnalyser
- Symplify\Astral\TypeAnalyzer\ClassMethodReturnTypeResolver

View File

@ -57,8 +57,8 @@ final class FuncCallValueResolver implements \RectorPrefix20220303\Symplify\Astr
if (!$this->isAllowedFunctionName($functionName)) {
return null;
}
if (\function_exists($functionName) && \is_callable($functionName)) {
return \call_user_func_array($functionName, $arguments);
if (\function_exists($functionName)) {
return $functionName(...$arguments);
}
throw new \RectorPrefix20220303\Symplify\Astral\Exception\ShouldNotHappenException();
}

View File

@ -0,0 +1,45 @@
<?php
declare (strict_types=1);
namespace RectorPrefix20220303\Symplify\Astral\TypeAnalyzer;
use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\FunctionVariant;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\MixedType;
use PHPStan\Type\Type;
use RectorPrefix20220303\Symplify\Astral\Exception\ShouldNotHappenException;
use RectorPrefix20220303\Symplify\Astral\Naming\SimpleNameResolver;
/**
* @api
*/
final class ClassMethodReturnTypeResolver
{
/**
* @var \Symplify\Astral\Naming\SimpleNameResolver
*/
private $simpleNameResolver;
public function __construct(\RectorPrefix20220303\Symplify\Astral\Naming\SimpleNameResolver $simpleNameResolver)
{
$this->simpleNameResolver = $simpleNameResolver;
}
public function resolve(\PhpParser\Node\Stmt\ClassMethod $classMethod, \PHPStan\Analyser\Scope $scope) : \PHPStan\Type\Type
{
$methodName = $this->simpleNameResolver->getName($classMethod);
if (!\is_string($methodName)) {
throw new \RectorPrefix20220303\Symplify\Astral\Exception\ShouldNotHappenException();
}
$classReflection = $scope->getClassReflection();
if (!$classReflection instanceof \PHPStan\Reflection\ClassReflection) {
return new \PHPStan\Type\MixedType();
}
$methodReflection = $classReflection->getMethod($methodName, $scope);
$functionVariant = \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($methodReflection->getVariants());
if (!$functionVariant instanceof \PHPStan\Reflection\FunctionVariant) {
return new \PHPStan\Type\MixedType();
}
return $functionVariant->getReturnType();
}
}

View File

@ -6,7 +6,7 @@
"php": ">=8.0",
"nette\/utils": "^3.2",
"symfony\/dependency-injection": "^5.4|^6.0",
"symplify\/package-builder": "^10.1"
"symplify\/package-builder": "^10.1.1"
},
"require-dev": {
"phpunit\/phpunit": "^9.5"
@ -23,36 +23,35 @@
},
"extra": {
"branch-alias": {
"dev-main": "10.1-dev"
"dev-main": "10.2-dev"
}
},
"conflict": {
"symplify\/astral": "<10.1.0",
"symplify\/composer-json-manipulator": "<10.1.0",
"symplify\/easy-coding-standard": "<10.1.0",
"symplify\/phpstan-rules": "<10.1.0",
"symplify\/easy-testing": "<10.1.0",
"symplify\/rule-doc-generator-contracts": "<10.1.0",
"symplify\/php-config-printer": "<10.1.0",
"symplify\/markdown-diff": "<10.1.0",
"symplify\/amnesia": "<10.1.0",
"symplify\/phpstan-extensions": "<10.1.0",
"symplify\/rule-doc-generator": "<10.1.0",
"symplify\/vendor-patches": "<10.1.0",
"symplify\/skipper": "<10.1.0",
"symplify\/smart-file-system": "<10.1.0",
"symplify\/symfony-static-dumper": "<10.1.0",
"symplify\/git-wrapper": "<10.1.0",
"symplify\/symplify-kernel": "<10.1.0",
"symplify\/monorepo-builder": "<10.1.0",
"symplify\/config-transformer": "<10.1.0",
"symplify\/easy-ci": "<10.1.0",
"symplify\/coding-standard": "<10.1.0",
"symplify\/latte-phpstan-compiler": "<10.1.0",
"symplify\/template-phpstan-compiler": "<10.1.0",
"symplify\/phpstan-latte-rules": "<10.1.0",
"symplify\/easy-parallel": "<10.1.0",
"symplify\/neon-config-dumper": "<10.1.0"
"symplify\/astral": "<10.1.1",
"symplify\/composer-json-manipulator": "<10.1.1",
"symplify\/easy-coding-standard": "<10.1.1",
"symplify\/phpstan-rules": "<10.1.1",
"symplify\/easy-testing": "<10.1.1",
"symplify\/rule-doc-generator-contracts": "<10.1.1",
"symplify\/php-config-printer": "<10.1.1",
"symplify\/amnesia": "<10.1.1",
"symplify\/phpstan-extensions": "<10.1.1",
"symplify\/rule-doc-generator": "<10.1.1",
"symplify\/vendor-patches": "<10.1.1",
"symplify\/skipper": "<10.1.1",
"symplify\/smart-file-system": "<10.1.1",
"symplify\/symfony-static-dumper": "<10.1.1",
"symplify\/git-wrapper": "<10.1.1",
"symplify\/symplify-kernel": "<10.1.1",
"symplify\/monorepo-builder": "<10.1.1",
"symplify\/config-transformer": "<10.1.1",
"symplify\/easy-ci": "<10.1.1",
"symplify\/coding-standard": "<10.1.1",
"symplify\/latte-phpstan-compiler": "<10.1.1",
"symplify\/template-phpstan-compiler": "<10.1.1",
"symplify\/phpstan-latte-rules": "<10.1.1",
"symplify\/easy-parallel": "<10.1.1",
"symplify\/neon-config-dumper": "<10.1.1"
},
"minimum-stability": "dev",
"prefer-stable": true

View File

@ -9,9 +9,9 @@
"symfony\/config": "^5.4|^6.0",
"symfony\/dependency-injection": "^5.4|^6.0",
"symfony\/filesystem": "^5.4|^6.0",
"symplify\/package-builder": "^10.1",
"symplify\/symplify-kernel": "^10.1",
"symplify\/smart-file-system": "^10.1"
"symplify\/package-builder": "^10.1.1",
"symplify\/symplify-kernel": "^10.1.1",
"symplify\/smart-file-system": "^10.1.1"
},
"require-dev": {
"phpunit\/phpunit": "^9.5"
@ -28,35 +28,34 @@
},
"extra": {
"branch-alias": {
"dev-main": "10.1-dev"
"dev-main": "10.2-dev"
}
},
"conflict": {
"symplify\/astral": "<10.1.0",
"symplify\/easy-coding-standard": "<10.1.0",
"symplify\/phpstan-rules": "<10.1.0",
"symplify\/easy-testing": "<10.1.0",
"symplify\/rule-doc-generator-contracts": "<10.1.0",
"symplify\/php-config-printer": "<10.1.0",
"symplify\/autowire-array-parameter": "<10.1.0",
"symplify\/markdown-diff": "<10.1.0",
"symplify\/amnesia": "<10.1.0",
"symplify\/phpstan-extensions": "<10.1.0",
"symplify\/rule-doc-generator": "<10.1.0",
"symplify\/vendor-patches": "<10.1.0",
"symplify\/skipper": "<10.1.0",
"symplify\/symfony-static-dumper": "<10.1.0",
"symplify\/git-wrapper": "<10.1.0",
"symplify\/astral": "<10.1.1",
"symplify\/easy-coding-standard": "<10.1.1",
"symplify\/phpstan-rules": "<10.1.1",
"symplify\/easy-testing": "<10.1.1",
"symplify\/rule-doc-generator-contracts": "<10.1.1",
"symplify\/php-config-printer": "<10.1.1",
"symplify\/autowire-array-parameter": "<10.1.1",
"symplify\/amnesia": "<10.1.1",
"symplify\/phpstan-extensions": "<10.1.1",
"symplify\/rule-doc-generator": "<10.1.1",
"symplify\/vendor-patches": "<10.1.1",
"symplify\/skipper": "<10.1.1",
"symplify\/symfony-static-dumper": "<10.1.1",
"symplify\/git-wrapper": "<10.1.1",
"symplify\/symplify-kernel": "<9.4.70",
"symplify\/monorepo-builder": "<10.1.0",
"symplify\/config-transformer": "<10.1.0",
"symplify\/easy-ci": "<10.1.0",
"symplify\/coding-standard": "<10.1.0",
"symplify\/latte-phpstan-compiler": "<10.1.0",
"symplify\/template-phpstan-compiler": "<10.1.0",
"symplify\/phpstan-latte-rules": "<10.1.0",
"symplify\/easy-parallel": "<10.1.0",
"symplify\/neon-config-dumper": "<10.1.0"
"symplify\/monorepo-builder": "<10.1.1",
"symplify\/config-transformer": "<10.1.1",
"symplify\/easy-ci": "<10.1.1",
"symplify\/coding-standard": "<10.1.1",
"symplify\/latte-phpstan-compiler": "<10.1.1",
"symplify\/template-phpstan-compiler": "<10.1.1",
"symplify\/phpstan-latte-rules": "<10.1.1",
"symplify\/easy-parallel": "<10.1.1",
"symplify\/neon-config-dumper": "<10.1.1"
},
"minimum-stability": "dev",
"prefer-stable": true

View File

@ -55,7 +55,7 @@ final class ComposerJson
*/
private $repositories = [];
/**
* @var array<string, mixed>
* @var array<string, string>
*/
private $require = [];
/**
@ -67,7 +67,7 @@ final class ComposerJson
*/
private $extra = [];
/**
* @var array<string, mixed>
* @var array<string, string>
*/
private $requireDev = [];
/**
@ -143,7 +143,7 @@ final class ComposerJson
$this->type = $type;
}
/**
* @param mixed[] $require
* @param array<string, string> $require
*/
public function setRequire(array $require) : void
{
@ -186,6 +186,9 @@ final class ComposerJson
{
return $this->requireDev;
}
/**
* @param array<string, string> $requireDev
*/
public function setRequireDev(array $requireDev) : void
{
$this->requireDev = $this->sortPackagesIfNeeded($requireDev);
@ -687,6 +690,7 @@ final class ComposerJson
return $autoloadDirectory;
}
/**
* @param array<string, string> $packages
* @return array<string, string>
*/
private function sortPackagesIfNeeded(array $packages) : array
@ -698,6 +702,7 @@ final class ComposerJson
return $packages;
}
/**
* @param string[] $items
* @return bool|int|string
*/
private function findPosition(string $key, array $items)

View File

@ -9,7 +9,7 @@
"react\/event-loop": "^1.2",
"react\/socket": "^1.10",
"symfony\/console": "^5.4|^6.0",
"symplify\/package-builder": "^10.1"
"symplify\/package-builder": "^10.1.1"
},
"require-dev": {
"phpunit\/phpunit": "^9.5"
@ -26,39 +26,38 @@
},
"extra": {
"branch-alias": {
"dev-main": "10.1-dev"
"dev-main": "10.2-dev"
}
},
"config": {
"platform-check": false
},
"conflict": {
"symplify\/astral": "<10.1.0",
"symplify\/easy-coding-standard": "<10.1.0",
"symplify\/phpstan-rules": "<10.1.0",
"symplify\/easy-testing": "<10.1.0",
"symplify\/rule-doc-generator-contracts": "<10.1.0",
"symplify\/php-config-printer": "<10.1.0",
"symplify\/autowire-array-parameter": "<10.1.0",
"symplify\/markdown-diff": "<10.1.0",
"symplify\/amnesia": "<10.1.0",
"symplify\/phpstan-extensions": "<10.1.0",
"symplify\/rule-doc-generator": "<10.1.0",
"symplify\/vendor-patches": "<10.1.0",
"symplify\/skipper": "<10.1.0",
"symplify\/symfony-static-dumper": "<10.1.0",
"symplify\/git-wrapper": "<10.1.0",
"symplify\/config-transformer": "<10.1.0",
"symplify\/easy-ci": "<10.1.0",
"symplify\/coding-standard": "<10.1.0",
"symplify\/latte-phpstan-compiler": "<10.1.0",
"symplify\/template-phpstan-compiler": "<10.1.0",
"symplify\/phpstan-latte-rules": "<10.1.0",
"symplify\/composer-json-manipulator": "<10.1.0",
"symplify\/smart-file-system": "<10.1.0",
"symplify\/monorepo-builder": "<10.1.0",
"symplify\/symplify-kernel": "<10.1.0",
"symplify\/neon-config-dumper": "<10.1.0"
"symplify\/astral": "<10.1.1",
"symplify\/easy-coding-standard": "<10.1.1",
"symplify\/phpstan-rules": "<10.1.1",
"symplify\/easy-testing": "<10.1.1",
"symplify\/rule-doc-generator-contracts": "<10.1.1",
"symplify\/php-config-printer": "<10.1.1",
"symplify\/autowire-array-parameter": "<10.1.1",
"symplify\/amnesia": "<10.1.1",
"symplify\/phpstan-extensions": "<10.1.1",
"symplify\/rule-doc-generator": "<10.1.1",
"symplify\/vendor-patches": "<10.1.1",
"symplify\/skipper": "<10.1.1",
"symplify\/symfony-static-dumper": "<10.1.1",
"symplify\/git-wrapper": "<10.1.1",
"symplify\/config-transformer": "<10.1.1",
"symplify\/easy-ci": "<10.1.1",
"symplify\/coding-standard": "<10.1.1",
"symplify\/latte-phpstan-compiler": "<10.1.1",
"symplify\/template-phpstan-compiler": "<10.1.1",
"symplify\/phpstan-latte-rules": "<10.1.1",
"symplify\/composer-json-manipulator": "<10.1.1",
"symplify\/smart-file-system": "<10.1.1",
"symplify\/monorepo-builder": "<10.1.1",
"symplify\/symplify-kernel": "<10.1.1",
"symplify\/neon-config-dumper": "<10.1.1"
},
"minimum-stability": "dev",
"prefer-stable": true

View File

@ -12,9 +12,9 @@
"symfony\/finder": "^5.4|^6.0",
"symfony\/console": "^5.4|^6.0",
"symfony\/dependency-injection": "^5.4|^6.0",
"symplify\/package-builder": "^10.1",
"symplify\/smart-file-system": "^10.1",
"symplify\/symplify-kernel": "^10.1"
"symplify\/package-builder": "^10.1.1",
"symplify\/smart-file-system": "^10.1.1",
"symplify\/symplify-kernel": "^10.1.1"
},
"require-dev": {
"phpunit\/phpunit": "^9.5"
@ -31,34 +31,33 @@
},
"extra": {
"branch-alias": {
"dev-main": "10.1-dev"
"dev-main": "10.2-dev"
}
},
"conflict": {
"symplify\/astral": "<10.1.0",
"symplify\/composer-json-manipulator": "<10.1.0",
"symplify\/easy-coding-standard": "<10.1.0",
"symplify\/phpstan-rules": "<10.1.0",
"symplify\/rule-doc-generator-contracts": "<10.1.0",
"symplify\/php-config-printer": "<10.1.0",
"symplify\/autowire-array-parameter": "<10.1.0",
"symplify\/markdown-diff": "<10.1.0",
"symplify\/amnesia": "<10.1.0",
"symplify\/phpstan-extensions": "<10.1.0",
"symplify\/rule-doc-generator": "<10.1.0",
"symplify\/vendor-patches": "<10.1.0",
"symplify\/skipper": "<10.1.0",
"symplify\/symfony-static-dumper": "<10.1.0",
"symplify\/git-wrapper": "<10.1.0",
"symplify\/monorepo-builder": "<10.1.0",
"symplify\/config-transformer": "<10.1.0",
"symplify\/easy-ci": "<10.1.0",
"symplify\/coding-standard": "<10.1.0",
"symplify\/latte-phpstan-compiler": "<10.1.0",
"symplify\/template-phpstan-compiler": "<10.1.0",
"symplify\/phpstan-latte-rules": "<10.1.0",
"symplify\/easy-parallel": "<10.1.0",
"symplify\/neon-config-dumper": "<10.1.0"
"symplify\/astral": "<10.1.1",
"symplify\/composer-json-manipulator": "<10.1.1",
"symplify\/easy-coding-standard": "<10.1.1",
"symplify\/phpstan-rules": "<10.1.1",
"symplify\/rule-doc-generator-contracts": "<10.1.1",
"symplify\/php-config-printer": "<10.1.1",
"symplify\/autowire-array-parameter": "<10.1.1",
"symplify\/amnesia": "<10.1.1",
"symplify\/phpstan-extensions": "<10.1.1",
"symplify\/rule-doc-generator": "<10.1.1",
"symplify\/vendor-patches": "<10.1.1",
"symplify\/skipper": "<10.1.1",
"symplify\/symfony-static-dumper": "<10.1.1",
"symplify\/git-wrapper": "<10.1.1",
"symplify\/monorepo-builder": "<10.1.1",
"symplify\/config-transformer": "<10.1.1",
"symplify\/easy-ci": "<10.1.1",
"symplify\/coding-standard": "<10.1.1",
"symplify\/latte-phpstan-compiler": "<10.1.1",
"symplify\/template-phpstan-compiler": "<10.1.1",
"symplify\/phpstan-latte-rules": "<10.1.1",
"symplify\/easy-parallel": "<10.1.1",
"symplify\/neon-config-dumper": "<10.1.1"
},
"minimum-stability": "dev",
"prefer-stable": true

View File

@ -17,6 +17,7 @@ final class FixtureFinder
$this->finderSanitizer = $finderSanitizer;
}
/**
* @param string[] $sources
* @return SmartFileInfo[]
*/
public function find(array $sources) : array

View File

@ -10,8 +10,8 @@
"symfony\/console": "^5.4|^6.0",
"symfony\/dependency-injection": "^5.4|^6.0",
"symfony\/finder": "^5.4|^6.0",
"symplify\/symplify-kernel": "^10.1",
"symplify\/easy-testing": "^10.1",
"symplify\/symplify-kernel": "^10.1.1",
"symplify\/easy-testing": "^10.1.1",
"nette\/neon": "^3.3.2"
},
"require-dev": {
@ -29,35 +29,34 @@
},
"extra": {
"branch-alias": {
"dev-main": "10.1-dev"
"dev-main": "10.2-dev"
}
},
"conflict": {
"symplify\/astral": "<10.1.0",
"symplify\/composer-json-manipulator": "<10.1.0",
"symplify\/easy-coding-standard": "<10.1.0",
"symplify\/phpstan-rules": "<10.1.0",
"symplify\/rule-doc-generator-contracts": "<10.1.0",
"symplify\/php-config-printer": "<10.1.0",
"symplify\/autowire-array-parameter": "<10.1.0",
"symplify\/markdown-diff": "<10.1.0",
"symplify\/amnesia": "<10.1.0",
"symplify\/phpstan-extensions": "<10.1.0",
"symplify\/rule-doc-generator": "<10.1.0",
"symplify\/vendor-patches": "<10.1.0",
"symplify\/skipper": "<10.1.0",
"symplify\/smart-file-system": "<10.1.0",
"symplify\/symfony-static-dumper": "<10.1.0",
"symplify\/git-wrapper": "<10.1.0",
"symplify\/monorepo-builder": "<10.1.0",
"symplify\/config-transformer": "<10.1.0",
"symplify\/easy-ci": "<10.1.0",
"symplify\/coding-standard": "<10.1.0",
"symplify\/latte-phpstan-compiler": "<10.1.0",
"symplify\/template-phpstan-compiler": "<10.1.0",
"symplify\/phpstan-latte-rules": "<10.1.0",
"symplify\/easy-parallel": "<10.1.0",
"symplify\/neon-config-dumper": "<10.1.0"
"symplify\/astral": "<10.1.1",
"symplify\/composer-json-manipulator": "<10.1.1",
"symplify\/easy-coding-standard": "<10.1.1",
"symplify\/phpstan-rules": "<10.1.1",
"symplify\/rule-doc-generator-contracts": "<10.1.1",
"symplify\/php-config-printer": "<10.1.1",
"symplify\/autowire-array-parameter": "<10.1.1",
"symplify\/amnesia": "<10.1.1",
"symplify\/phpstan-extensions": "<10.1.1",
"symplify\/rule-doc-generator": "<10.1.1",
"symplify\/vendor-patches": "<10.1.1",
"symplify\/skipper": "<10.1.1",
"symplify\/smart-file-system": "<10.1.1",
"symplify\/symfony-static-dumper": "<10.1.1",
"symplify\/git-wrapper": "<10.1.1",
"symplify\/monorepo-builder": "<10.1.1",
"symplify\/config-transformer": "<10.1.1",
"symplify\/easy-ci": "<10.1.1",
"symplify\/coding-standard": "<10.1.1",
"symplify\/latte-phpstan-compiler": "<10.1.1",
"symplify\/template-phpstan-compiler": "<10.1.1",
"symplify\/phpstan-latte-rules": "<10.1.1",
"symplify\/easy-parallel": "<10.1.1",
"symplify\/neon-config-dumper": "<10.1.1"
},
"minimum-stability": "dev",
"prefer-stable": true

View File

@ -13,37 +13,36 @@
},
"extra": {
"branch-alias": {
"dev-main": "10.1-dev"
"dev-main": "10.2-dev"
}
},
"conflict": {
"symplify\/astral": "<10.1.0",
"symplify\/composer-json-manipulator": "<10.1.0",
"symplify\/easy-coding-standard": "<10.1.0",
"symplify\/phpstan-rules": "<10.1.0",
"symplify\/easy-testing": "<10.1.0",
"symplify\/php-config-printer": "<10.1.0",
"symplify\/autowire-array-parameter": "<10.1.0",
"symplify\/markdown-diff": "<10.1.0",
"symplify\/package-builder": "<10.1.0",
"symplify\/amnesia": "<10.1.0",
"symplify\/phpstan-extensions": "<10.1.0",
"symplify\/rule-doc-generator": "<10.1.0",
"symplify\/vendor-patches": "<10.1.0",
"symplify\/skipper": "<10.1.0",
"symplify\/smart-file-system": "<10.1.0",
"symplify\/symfony-static-dumper": "<10.1.0",
"symplify\/git-wrapper": "<10.1.0",
"symplify\/symplify-kernel": "<10.1.0",
"symplify\/monorepo-builder": "<10.1.0",
"symplify\/config-transformer": "<10.1.0",
"symplify\/easy-ci": "<10.1.0",
"symplify\/coding-standard": "<10.1.0",
"symplify\/latte-phpstan-compiler": "<10.1.0",
"symplify\/template-phpstan-compiler": "<10.1.0",
"symplify\/phpstan-latte-rules": "<10.1.0",
"symplify\/easy-parallel": "<10.1.0",
"symplify\/neon-config-dumper": "<10.1.0"
"symplify\/astral": "<10.1.1",
"symplify\/composer-json-manipulator": "<10.1.1",
"symplify\/easy-coding-standard": "<10.1.1",
"symplify\/phpstan-rules": "<10.1.1",
"symplify\/easy-testing": "<10.1.1",
"symplify\/php-config-printer": "<10.1.1",
"symplify\/autowire-array-parameter": "<10.1.1",
"symplify\/package-builder": "<10.1.1",
"symplify\/amnesia": "<10.1.1",
"symplify\/phpstan-extensions": "<10.1.1",
"symplify\/rule-doc-generator": "<10.1.1",
"symplify\/vendor-patches": "<10.1.1",
"symplify\/skipper": "<10.1.1",
"symplify\/smart-file-system": "<10.1.1",
"symplify\/symfony-static-dumper": "<10.1.1",
"symplify\/git-wrapper": "<10.1.1",
"symplify\/symplify-kernel": "<10.1.1",
"symplify\/monorepo-builder": "<10.1.1",
"symplify\/config-transformer": "<10.1.1",
"symplify\/easy-ci": "<10.1.1",
"symplify\/coding-standard": "<10.1.1",
"symplify\/latte-phpstan-compiler": "<10.1.1",
"symplify\/template-phpstan-compiler": "<10.1.1",
"symplify\/phpstan-latte-rules": "<10.1.1",
"symplify\/easy-parallel": "<10.1.1",
"symplify\/neon-config-dumper": "<10.1.1"
},
"minimum-stability": "dev",
"prefer-stable": true

View File

@ -9,9 +9,9 @@
"symfony\/dependency-injection": "^5.4|^6.0",
"symfony\/finder": "^5.4|^6.0",
"symfony\/filesystem": "^5.4|^6.0",
"symplify\/package-builder": "^10.1",
"symplify\/symplify-kernel": "^10.1",
"symplify\/smart-file-system": "^10.1"
"symplify\/package-builder": "^10.1.1",
"symplify\/symplify-kernel": "^10.1.1",
"symplify\/smart-file-system": "^10.1.1"
},
"require-dev": {
"phpunit\/phpunit": "^9.5"
@ -28,34 +28,33 @@
},
"extra": {
"branch-alias": {
"dev-main": "10.1-dev"
"dev-main": "10.2-dev"
}
},
"conflict": {
"symplify\/astral": "<10.1.0",
"symplify\/composer-json-manipulator": "<10.1.0",
"symplify\/easy-coding-standard": "<10.1.0",
"symplify\/phpstan-rules": "<10.1.0",
"symplify\/easy-testing": "<10.1.0",
"symplify\/rule-doc-generator-contracts": "<10.1.0",
"symplify\/php-config-printer": "<10.1.0",
"symplify\/autowire-array-parameter": "<10.1.0",
"symplify\/markdown-diff": "<10.1.0",
"symplify\/amnesia": "<10.1.0",
"symplify\/phpstan-extensions": "<10.1.0",
"symplify\/rule-doc-generator": "<10.1.0",
"symplify\/vendor-patches": "<10.1.0",
"symplify\/symfony-static-dumper": "<10.1.0",
"symplify\/git-wrapper": "<10.1.0",
"symplify\/monorepo-builder": "<10.1.0",
"symplify\/config-transformer": "<10.1.0",
"symplify\/easy-ci": "<10.1.0",
"symplify\/coding-standard": "<10.1.0",
"symplify\/latte-phpstan-compiler": "<10.1.0",
"symplify\/template-phpstan-compiler": "<10.1.0",
"symplify\/phpstan-latte-rules": "<10.1.0",
"symplify\/easy-parallel": "<10.1.0",
"symplify\/neon-config-dumper": "<10.1.0"
"symplify\/astral": "<10.1.1",
"symplify\/composer-json-manipulator": "<10.1.1",
"symplify\/easy-coding-standard": "<10.1.1",
"symplify\/phpstan-rules": "<10.1.1",
"symplify\/easy-testing": "<10.1.1",
"symplify\/rule-doc-generator-contracts": "<10.1.1",
"symplify\/php-config-printer": "<10.1.1",
"symplify\/autowire-array-parameter": "<10.1.1",
"symplify\/amnesia": "<10.1.1",
"symplify\/phpstan-extensions": "<10.1.1",
"symplify\/rule-doc-generator": "<10.1.1",
"symplify\/vendor-patches": "<10.1.1",
"symplify\/symfony-static-dumper": "<10.1.1",
"symplify\/git-wrapper": "<10.1.1",
"symplify\/monorepo-builder": "<10.1.1",
"symplify\/config-transformer": "<10.1.1",
"symplify\/easy-ci": "<10.1.1",
"symplify\/coding-standard": "<10.1.1",
"symplify\/latte-phpstan-compiler": "<10.1.1",
"symplify\/template-phpstan-compiler": "<10.1.1",
"symplify\/phpstan-latte-rules": "<10.1.1",
"symplify\/easy-parallel": "<10.1.1",
"symplify\/neon-config-dumper": "<10.1.1"
},
"minimum-stability": "dev",
"prefer-stable": true

View File

@ -24,37 +24,36 @@
},
"extra": {
"branch-alias": {
"dev-main": "10.1-dev"
"dev-main": "10.2-dev"
}
},
"conflict": {
"symplify\/astral": "<10.1.0",
"symplify\/composer-json-manipulator": "<10.1.0",
"symplify\/easy-coding-standard": "<10.1.0",
"symplify\/phpstan-rules": "<10.1.0",
"symplify\/easy-testing": "<10.1.0",
"symplify\/rule-doc-generator-contracts": "<10.1.0",
"symplify\/php-config-printer": "<10.1.0",
"symplify\/autowire-array-parameter": "<10.1.0",
"symplify\/markdown-diff": "<10.1.0",
"symplify\/package-builder": "<10.1.0",
"symplify\/amnesia": "<10.1.0",
"symplify\/phpstan-extensions": "<10.1.0",
"symplify\/rule-doc-generator": "<10.1.0",
"symplify\/vendor-patches": "<10.1.0",
"symplify\/skipper": "<10.1.0",
"symplify\/symfony-static-dumper": "<10.1.0",
"symplify\/git-wrapper": "<10.1.0",
"symplify\/symplify-kernel": "<10.1.0",
"symplify\/monorepo-builder": "<10.1.0",
"symplify\/config-transformer": "<10.1.0",
"symplify\/easy-ci": "<10.1.0",
"symplify\/coding-standard": "<10.1.0",
"symplify\/latte-phpstan-compiler": "<10.1.0",
"symplify\/template-phpstan-compiler": "<10.1.0",
"symplify\/phpstan-latte-rules": "<10.1.0",
"symplify\/easy-parallel": "<10.1.0",
"symplify\/neon-config-dumper": "<10.1.0"
"symplify\/astral": "<10.1.1",
"symplify\/composer-json-manipulator": "<10.1.1",
"symplify\/easy-coding-standard": "<10.1.1",
"symplify\/phpstan-rules": "<10.1.1",
"symplify\/easy-testing": "<10.1.1",
"symplify\/rule-doc-generator-contracts": "<10.1.1",
"symplify\/php-config-printer": "<10.1.1",
"symplify\/autowire-array-parameter": "<10.1.1",
"symplify\/package-builder": "<10.1.1",
"symplify\/amnesia": "<10.1.1",
"symplify\/phpstan-extensions": "<10.1.1",
"symplify\/rule-doc-generator": "<10.1.1",
"symplify\/vendor-patches": "<10.1.1",
"symplify\/skipper": "<10.1.1",
"symplify\/symfony-static-dumper": "<10.1.1",
"symplify\/git-wrapper": "<10.1.1",
"symplify\/symplify-kernel": "<10.1.1",
"symplify\/monorepo-builder": "<10.1.1",
"symplify\/config-transformer": "<10.1.1",
"symplify\/easy-ci": "<10.1.1",
"symplify\/coding-standard": "<10.1.1",
"symplify\/latte-phpstan-compiler": "<10.1.1",
"symplify\/template-phpstan-compiler": "<10.1.1",
"symplify\/phpstan-latte-rules": "<10.1.1",
"symplify\/easy-parallel": "<10.1.1",
"symplify\/neon-config-dumper": "<10.1.1"
},
"minimum-stability": "dev",
"prefer-stable": true

View File

@ -6,10 +6,10 @@
"php": ">=8.0",
"symfony\/console": "^5.4|^6.0",
"symfony\/dependency-injection": "^5.4|^6.0",
"symplify\/smart-file-system": "^10.1",
"symplify\/composer-json-manipulator": "^10.1",
"symplify\/autowire-array-parameter": "^10.1",
"symplify\/package-builder": "^10.1",
"symplify\/smart-file-system": "^10.1.1",
"symplify\/composer-json-manipulator": "^10.1.1",
"symplify\/autowire-array-parameter": "^10.1.1",
"symplify\/package-builder": "^10.1.1",
"webmozart\/assert": "^1.10"
},
"require-dev": {
@ -27,33 +27,32 @@
},
"extra": {
"branch-alias": {
"dev-main": "10.1-dev"
"dev-main": "10.2-dev"
}
},
"conflict": {
"symplify\/astral": "<10.1.0",
"symplify\/easy-coding-standard": "<10.1.0",
"symplify\/phpstan-rules": "<10.1.0",
"symplify\/easy-testing": "<10.1.0",
"symplify\/rule-doc-generator-contracts": "<10.1.0",
"symplify\/php-config-printer": "<10.1.0",
"symplify\/markdown-diff": "<10.1.0",
"symplify\/amnesia": "<10.1.0",
"symplify\/phpstan-extensions": "<10.1.0",
"symplify\/rule-doc-generator": "<10.1.0",
"symplify\/vendor-patches": "<10.1.0",
"symplify\/skipper": "<10.1.0",
"symplify\/symfony-static-dumper": "<10.1.0",
"symplify\/git-wrapper": "<10.1.0",
"symplify\/monorepo-builder": "<10.1.0",
"symplify\/config-transformer": "<10.1.0",
"symplify\/easy-ci": "<10.1.0",
"symplify\/coding-standard": "<10.1.0",
"symplify\/latte-phpstan-compiler": "<10.1.0",
"symplify\/template-phpstan-compiler": "<10.1.0",
"symplify\/phpstan-latte-rules": "<10.1.0",
"symplify\/easy-parallel": "<10.1.0",
"symplify\/neon-config-dumper": "<10.1.0"
"symplify\/astral": "<10.1.1",
"symplify\/easy-coding-standard": "<10.1.1",
"symplify\/phpstan-rules": "<10.1.1",
"symplify\/easy-testing": "<10.1.1",
"symplify\/rule-doc-generator-contracts": "<10.1.1",
"symplify\/php-config-printer": "<10.1.1",
"symplify\/amnesia": "<10.1.1",
"symplify\/phpstan-extensions": "<10.1.1",
"symplify\/rule-doc-generator": "<10.1.1",
"symplify\/vendor-patches": "<10.1.1",
"symplify\/skipper": "<10.1.1",
"symplify\/symfony-static-dumper": "<10.1.1",
"symplify\/git-wrapper": "<10.1.1",
"symplify\/monorepo-builder": "<10.1.1",
"symplify\/config-transformer": "<10.1.1",
"symplify\/easy-ci": "<10.1.1",
"symplify\/coding-standard": "<10.1.1",
"symplify\/latte-phpstan-compiler": "<10.1.1",
"symplify\/template-phpstan-compiler": "<10.1.1",
"symplify\/phpstan-latte-rules": "<10.1.1",
"symplify\/easy-parallel": "<10.1.1",
"symplify\/neon-config-dumper": "<10.1.1"
},
"minimum-stability": "dev",
"prefer-stable": true

View File

@ -12,8 +12,8 @@
"symfony\/dependency-injection": "^5.4|^6.0",
"sebastian\/diff": "^4.0",
"cweagans\/composer-patches": "^1.7",
"symplify\/composer-json-manipulator": "^10.1",
"symplify\/symplify-kernel": "^10.1"
"symplify\/composer-json-manipulator": "^10.1.1",
"symplify\/symplify-kernel": "^10.1.1"
},
"require-dev": {
"phpunit\/phpunit": "^9.5"
@ -30,35 +30,34 @@
},
"extra": {
"branch-alias": {
"dev-main": "10.1-dev"
"dev-main": "10.2-dev"
}
},
"conflict": {
"symplify\/astral": "<10.1.0",
"symplify\/easy-coding-standard": "<10.1.0",
"symplify\/phpstan-rules": "<10.1.0",
"symplify\/easy-testing": "<10.1.0",
"symplify\/rule-doc-generator-contracts": "<10.1.0",
"symplify\/php-config-printer": "<10.1.0",
"symplify\/autowire-array-parameter": "<10.1.0",
"symplify\/markdown-diff": "<10.1.0",
"symplify\/package-builder": "<10.1.0",
"symplify\/amnesia": "<10.1.0",
"symplify\/phpstan-extensions": "<10.1.0",
"symplify\/rule-doc-generator": "<10.1.0",
"symplify\/skipper": "<10.1.0",
"symplify\/smart-file-system": "<10.1.0",
"symplify\/symfony-static-dumper": "<10.1.0",
"symplify\/git-wrapper": "<10.1.0",
"symplify\/monorepo-builder": "<10.1.0",
"symplify\/config-transformer": "<10.1.0",
"symplify\/easy-ci": "<10.1.0",
"symplify\/coding-standard": "<10.1.0",
"symplify\/latte-phpstan-compiler": "<10.1.0",
"symplify\/template-phpstan-compiler": "<10.1.0",
"symplify\/phpstan-latte-rules": "<10.1.0",
"symplify\/easy-parallel": "<10.1.0",
"symplify\/neon-config-dumper": "<10.1.0"
"symplify\/astral": "<10.1.1",
"symplify\/easy-coding-standard": "<10.1.1",
"symplify\/phpstan-rules": "<10.1.1",
"symplify\/easy-testing": "<10.1.1",
"symplify\/rule-doc-generator-contracts": "<10.1.1",
"symplify\/php-config-printer": "<10.1.1",
"symplify\/autowire-array-parameter": "<10.1.1",
"symplify\/package-builder": "<10.1.1",
"symplify\/amnesia": "<10.1.1",
"symplify\/phpstan-extensions": "<10.1.1",
"symplify\/rule-doc-generator": "<10.1.1",
"symplify\/skipper": "<10.1.1",
"symplify\/smart-file-system": "<10.1.1",
"symplify\/symfony-static-dumper": "<10.1.1",
"symplify\/git-wrapper": "<10.1.1",
"symplify\/monorepo-builder": "<10.1.1",
"symplify\/config-transformer": "<10.1.1",
"symplify\/easy-ci": "<10.1.1",
"symplify\/coding-standard": "<10.1.1",
"symplify\/latte-phpstan-compiler": "<10.1.1",
"symplify\/template-phpstan-compiler": "<10.1.1",
"symplify\/phpstan-latte-rules": "<10.1.1",
"symplify\/easy-parallel": "<10.1.1",
"symplify\/neon-config-dumper": "<10.1.1"
},
"minimum-stability": "dev",
"prefer-stable": true