1
0
mirror of https://github.com/danog/psalm.git synced 2024-12-13 09:47:29 +01:00
psalm/tests/FileManipulation/UnusedCodeManipulationTest.php

672 lines
22 KiB
PHP
Raw Normal View History

2019-05-02 18:15:38 +02:00
<?php
2019-05-02 18:15:38 +02:00
namespace Psalm\Tests\FileManipulation;
class UnusedCodeManipulationTest extends FileManipulationTestCase
2019-05-02 18:15:38 +02:00
{
public function providerValidCodeParse(): array
2019-05-02 18:15:38 +02:00
{
return [
'removePossiblyUnusedMethod' => [
'input' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public function foo() : void {}
public function bar() : void {}
}
(new A)->foo();',
'output' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public function foo() : void {}
}
(new A)->foo();',
'php_version' => '7.1',
'issues_to_fix' => ['PossiblyUnusedMethod'],
'safe_types' => true,
2019-05-02 18:15:38 +02:00
],
'removePossiblyUnusedMethodInMiddle' => [
'input' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public function foo() : void {}
public function bar() : void {}
public function bat() : void {}
}
(new A)->foo();
(new A)->bat();',
'output' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public function foo() : void {}
public function bat() : void {}
}
(new A)->foo();
(new A)->bat();',
'php_version' => '7.1',
'issues_to_fix' => ['PossiblyUnusedMethod'],
'safe_types' => true,
2019-05-02 18:15:38 +02:00
],
'removeAllPossiblyUnusedMethods' => [
'input' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public function foo() : void {}
public function bar() : void {}
public function bat() : void {}
}
new A();',
'output' => '<?php
2019-05-02 18:15:38 +02:00
class A {
}
new A();',
'php_version' => '7.1',
'issues_to_fix' => ['PossiblyUnusedMethod'],
'safe_types' => true,
2019-05-02 18:15:38 +02:00
],
'dontRemovePossiblyUnusedMethodWithMixedUse' => [
'input' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public function foo() : void {}
}
function foo($a) {
$a->foo();
}',
'output' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public function foo() : void {}
}
function foo($a) {
$a->foo();
}',
'php_version' => '7.1',
'issues_to_fix' => ['PossiblyUnusedMethod'],
'safe_types' => true,
2019-05-02 18:15:38 +02:00
],
'dontRemovePossiblyUnusedMethodWithSuppression' => [
'input' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public function foo() : void {}
/** @psalm-suppress PossiblyUnusedMethod */
public function bar() : void {}
}
(new A)->foo();',
'output' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public function foo() : void {}
/** @psalm-suppress PossiblyUnusedMethod */
public function bar() : void {}
}
(new A)->foo();',
'php_version' => '7.1',
'issues_to_fix' => ['PossiblyUnusedMethod'],
'safe_types' => true,
2019-05-02 18:15:38 +02:00
],
'removeUnusedMethod' => [
'input' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public function foo() : void {}
private function bar() : void {}
}
(new A)->foo();',
'output' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public function foo() : void {}
}
(new A)->foo();',
'php_version' => '7.1',
'issues_to_fix' => ['UnusedMethod'],
'safe_types' => true,
2019-05-02 18:15:38 +02:00
],
'removeUnusedMethodAtBeginning' => [
'input' => '<?php
2019-05-02 18:15:38 +02:00
class A {
private function foo() : void {}
public function bar() : void {}
}
(new A)->bar();',
'output' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public function bar() : void {}
}
(new A)->bar();',
'php_version' => '7.1',
'issues_to_fix' => ['UnusedMethod'],
'safe_types' => true,
2019-05-02 18:15:38 +02:00
],
'removePossiblyUnusedMethodWithDocblock' => [
'input' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public function foo() : void {}
/** @return void */
public function bar() : void {}
}
(new A)->foo();',
'output' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public function foo() : void {}
}
(new A)->foo();',
'php_version' => '7.1',
'issues_to_fix' => ['PossiblyUnusedMethod'],
'safe_types' => true,
2019-05-02 18:15:38 +02:00
],
'removeUnusedMethodWithDocblock' => [
'input' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public function foo() : void {}
/** @return void */
private function bar() : void {}
}
(new A)->foo();',
'output' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public function foo() : void {}
}
(new A)->foo();',
'php_version' => '7.1',
'issues_to_fix' => ['UnusedMethod'],
'safe_types' => true,
2019-05-02 18:15:38 +02:00
],
'dontRemovePossiblyUnusedMethodWithVariableCall' => [
'input' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public function foo() : void {}
}
function foo(A $a, string $var) {
echo $a->$var();
}',
'output' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public function foo() : void {}
}
function foo(A $a, string $var) {
echo $a->$var();
}',
'php_version' => '7.1',
'issues_to_fix' => ['PossiblyUnusedMethod'],
'safe_types' => true,
2019-05-02 18:15:38 +02:00
],
'dontRemovePossiblyUnusedMethodWithVariableCallableCall' => [
'input' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public function foo() : void {}
}
function takeCallable(callable $c) : void {}
function foo(A $a, string $var) {
takeCallable([$a, $var]);
}',
'output' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public function foo() : void {}
}
function takeCallable(callable $c) : void {}
function foo(A $a, string $var) {
takeCallable([$a, $var]);
}',
'php_version' => '7.1',
'issues_to_fix' => ['PossiblyUnusedMethod'],
'safe_types' => true,
2019-05-02 18:15:38 +02:00
],
'dontRemovePossiblyUnusedMethodWithCallUserFuncCall' => [
'input' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public function foo() : void {}
}
function foo(A $a, string $var) {
call_user_func([$a, $var]);
}',
'output' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public function foo() : void {}
}
function foo(A $a, string $var) {
call_user_func([$a, $var]);
}',
'php_version' => '7.1',
'issues_to_fix' => ['PossiblyUnusedMethod'],
'safe_types' => true,
2019-05-02 18:15:38 +02:00
],
'dontRemovePossiblyUnusedMethodWithVariableCallableLhsCall' => [
'input' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public function foo() : void {}
public function bar() : void {}
}
function takeCallable(callable $c) : void {}
function foo($a) {
takeCallable([$a, "foo"]);
}
foo(new A);',
'output' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public function foo() : void {}
}
function takeCallable(callable $c) : void {}
function foo($a) {
takeCallable([$a, "foo"]);
}
foo(new A);',
'php_version' => '7.1',
'issues_to_fix' => ['PossiblyUnusedMethod'],
'safe_types' => true,
2019-05-02 18:15:38 +02:00
],
'dontRemovePossiblyUnusedMethodWithVariableCallOnParent' => [
'input' => '<?php
2019-05-02 18:15:38 +02:00
class A { }
class B extends A {
public function foo() : void {}
}
function foo(A $a, string $var) {
echo $a->$var();
}
foo(new B);',
'output' => '<?php
2019-05-02 18:15:38 +02:00
class A { }
class B extends A {
public function foo() : void {}
}
function foo(A $a, string $var) {
echo $a->$var();
}
foo(new B);',
'php_version' => '7.1',
'issues_to_fix' => ['PossiblyUnusedMethod'],
'safe_types' => true,
2019-05-02 18:15:38 +02:00
],
'removePossiblyUnusedMethodWithVariableCall' => [
'input' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public function foo() : void {}
}
function foo(A $a, string $var) {
/** @psalm-ignore-variable-method */
echo $a->$var();
}',
'output' => '<?php
2019-05-02 18:15:38 +02:00
class A {
}
function foo(A $a, string $var) {
/** @psalm-ignore-variable-method */
echo $a->$var();
}',
'php_version' => '7.1',
'issues_to_fix' => ['PossiblyUnusedMethod'],
'safe_types' => true,
2019-05-02 18:15:38 +02:00
],
'removePossiblyUnusedMethodAndMissingReturnType' => [
'input' => '<?php
class A {
public function foo() {}
}
new A();',
'output' => '<?php
class A {
}
new A();',
'php_version' => '7.1',
'issues_to_fix' => ['PossiblyUnusedMethod', 'MissingReturnType'],
'safe_types' => true,
],
2019-05-02 18:15:38 +02:00
'removePossiblyUnusedPropertyWithDocblock' => [
'input' => '<?php
2019-05-02 18:15:38 +02:00
class A {
/** @var string */
public $foo = "hello";
/** @var string */
public $bar = "hello";
}
echo (new A)->foo;',
'output' => '<?php
2019-05-02 18:15:38 +02:00
class A {
/** @var string */
public $foo = "hello";
}
echo (new A)->foo;',
'php_version' => '7.1',
'issues_to_fix' => ['PossiblyUnusedProperty'],
'safe_types' => true,
2019-05-02 18:15:38 +02:00
],
'dontRemovePossiblyUnusedPropertyWithMixedUse' => [
'input' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public $foo = "hello";
}
function foo($a) {
echo $a->foo;
}',
'output' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public $foo = "hello";
}
function foo($a) {
echo $a->foo;
}',
'php_version' => '7.1',
'issues_to_fix' => ['PossiblyUnusedProperty'],
'safe_types' => true,
2019-05-02 18:15:38 +02:00
],
'dontRemovePossiblyUnusedPropertyWithSuppression' => [
'input' => '<?php
2019-05-02 18:15:38 +02:00
/** @psalm-suppress PossiblyUnusedProperty */
class A {
public $foo = "hello";
}',
'output' => '<?php
2019-05-02 18:15:38 +02:00
/** @psalm-suppress PossiblyUnusedProperty */
class A {
public $foo = "hello";
}',
'php_version' => '7.1',
'issues_to_fix' => ['PossiblyUnusedProperty'],
'safe_types' => true,
2019-05-02 18:15:38 +02:00
],
'dontRemovePossiblyUnusedPropertyWithVariableFetch' => [
'input' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public $foo = "hello";
}
function foo(A $a, string $var) {
echo $a->$var;
}',
'output' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public $foo = "hello";
}
function foo(A $a, string $var) {
echo $a->$var;
}',
'php_version' => '7.1',
'issues_to_fix' => ['PossiblyUnusedProperty'],
'safe_types' => true,
2019-05-02 18:15:38 +02:00
],
'removePossiblyUnusedPropertyWithVariableFetch' => [
'input' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public $foo = "hello";
}
function foo(A $a, string $var) {
/** @psalm-ignore-variable-property */
echo $a->$var;
}',
'output' => '<?php
2019-05-02 18:15:38 +02:00
class A {
}
function foo(A $a, string $var) {
/** @psalm-ignore-variable-property */
echo $a->$var;
}',
'php_version' => '7.1',
'issues_to_fix' => ['PossiblyUnusedProperty'],
'safe_types' => true,
2019-05-02 18:15:38 +02:00
],
'dontRemovePossiblyUnusedPropertyWithVariableFetchInParent' => [
'input' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public function __set(string $k, $v) {
$this->$k = $v;
}
}
class B extends A {
public $foo = "hello";
}
(new B())->__set("foo", "bar");',
'output' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public function __set(string $k, $v) {
$this->$k = $v;
}
}
class B extends A {
public $foo = "hello";
}
(new B())->__set("foo", "bar");',
'php_version' => '7.1',
'issues_to_fix' => ['PossiblyUnusedProperty'],
'safe_types' => true,
2019-05-02 18:15:38 +02:00
],
'dontRemovePossiblyUnusedPropertyWithVariableOnParent' => [
'input' => '<?php
2019-05-02 18:15:38 +02:00
class A {}
class B extends A {
public $foo = "hello";
}
function foo(A $a, string $var) {
echo $a->$var;
}
foo(new A(), "foo");',
'output' => '<?php
2019-05-02 18:15:38 +02:00
class A {}
class B extends A {
public $foo = "hello";
}
function foo(A $a, string $var) {
echo $a->$var;
}
foo(new A(), "foo");',
'php_version' => '7.1',
'issues_to_fix' => ['PossiblyUnusedProperty'],
'safe_types' => true,
2019-05-02 18:15:38 +02:00
],
'dontRemovePossiblyUnusedPropertyWithVariableFetchImplementedInterface' => [
'input' => '<?php
2019-05-02 18:15:38 +02:00
interface I {}
class A implements I {
public $foo = "hello";
}
function foo(I $i, string $var) {
echo $i->$var;
}
foo(new A(), "foo");',
'output' => '<?php
2019-05-02 18:15:38 +02:00
interface I {}
class A implements I {
public $foo = "hello";
}
function foo(I $i, string $var) {
echo $i->$var;
}
foo(new A(), "foo");',
'php_version' => '7.1',
'issues_to_fix' => ['PossiblyUnusedProperty'],
'safe_types' => true,
2019-05-02 18:15:38 +02:00
],
'dontRemovePossiblyUnusedPropertyWithStaticVariableFetch' => [
'input' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public static $foo = "hello";
}
function foo(string $var) {
echo A::$$var;
}',
'output' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public static $foo = "hello";
}
function foo(string $var) {
echo A::$$var;
}',
'php_version' => '7.1',
'issues_to_fix' => ['PossiblyUnusedProperty'],
'safe_types' => true,
2019-05-02 18:15:38 +02:00
],
'dontRemovePossiblyUnusedPropertyWithVariableAssignment' => [
'input' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public $foo = "hello";
}
function foo(A $a, string $var) {
$a->$var = "hello";
}',
'output' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public $foo = "hello";
}
function foo(A $a, string $var) {
$a->$var = "hello";
}',
'php_version' => '7.1',
'issues_to_fix' => ['PossiblyUnusedProperty'],
'safe_types' => true,
2019-05-02 18:15:38 +02:00
],
'dontRemovePossiblyUnusedPropertyWithVariableAssignmentOnParent' => [
'input' => '<?php
2019-05-02 18:15:38 +02:00
class A {}
class B extends A {
public $foo = "hello";
}
function foo(A $a, string $var) {
$a->$var = "hello";
}
foo(new B);',
'output' => '<?php
2019-05-02 18:15:38 +02:00
class A {}
class B extends A {
public $foo = "hello";
}
function foo(A $a, string $var) {
$a->$var = "hello";
}
foo(new B);',
'php_version' => '7.1',
'issues_to_fix' => ['PossiblyUnusedProperty'],
'safe_types' => true,
2019-05-02 18:15:38 +02:00
],
'dontRemovePossiblyUnusedPropertyWithStaticVariableAssignment' => [
'input' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public static $foo = "hello";
}
function foo(string $var) {
A::$$var = "hello";
}',
'output' => '<?php
2019-05-02 18:15:38 +02:00
class A {
public static $foo = "hello";
}
function foo(string $var) {
A::$$var = "hello";
}',
'php_version' => '7.1',
'issues_to_fix' => ['PossiblyUnusedProperty'],
'safe_types' => true,
2019-05-02 18:15:38 +02:00
],
'removeUnusedPropertyWithDocblock' => [
'input' => '<?php
2019-05-02 18:15:38 +02:00
class A {
/** @var string */
public $foo = "hello";
/** @var string */
private $bar = "hello";
}
echo (new A)->foo;',
'output' => '<?php
2019-05-02 18:15:38 +02:00
class A {
/** @var string */
public $foo = "hello";
}
echo (new A)->foo;',
'php_version' => '7.1',
'issues_to_fix' => ['UnusedProperty'],
'safe_types' => true,
2019-05-02 18:15:38 +02:00
],
];
}
}