diff --git a/infection.json.dist b/infection.json.dist index 7827eb88b..e6852ad96 100644 --- a/infection.json.dist +++ b/infection.json.dist @@ -10,5 +10,12 @@ "badge": { "branch": "master" } + }, + "mutators": { + "MethodCallRemoval": { + "ignore": [ + "Infection\\Finder\\SourceFilesFinder::__construct::63" + ] + } } } diff --git a/src/Mutator/Util/Mutator.php b/src/Mutator/Util/Mutator.php index 019a2e08b..551f0943d 100644 --- a/src/Mutator/Util/Mutator.php +++ b/src/Mutator/Util/Mutator.php @@ -67,7 +67,11 @@ final public function shouldMutate(Node $node): bool return true; } - return !$this->config->isIgnored($reflectionClass->getName(), $node->getAttribute(ReflectionVisitor::FUNCTION_NAME, '')); + return !$this->config->isIgnored( + $reflectionClass->getName(), + $node->getAttribute(ReflectionVisitor::FUNCTION_NAME, ''), + $node->getLine() + ); } final public static function getName(): string diff --git a/src/Mutator/Util/MutatorConfig.php b/src/Mutator/Util/MutatorConfig.php index d7e1c0618..6eb89339e 100644 --- a/src/Mutator/Util/MutatorConfig.php +++ b/src/Mutator/Util/MutatorConfig.php @@ -56,7 +56,7 @@ public function __construct(array $config) $this->mutatorSettings = $config['settings'] ?? []; } - public function isIgnored(string $class, string $method): bool + public function isIgnored(string $class, string $method, int $lineNumber = null): bool { if (\in_array($class, $this->ignoreConfig)) { return true; @@ -67,7 +67,10 @@ public function isIgnored(string $class, string $method): bool } foreach ($this->ignoreConfig as $ignorePattern) { - if (fnmatch($ignorePattern, $class, FNM_NOESCAPE) || fnmatch($ignorePattern, $class . '::' . $method, FNM_NOESCAPE)) { + if (fnmatch($ignorePattern, $class, FNM_NOESCAPE) + || fnmatch($ignorePattern, $class . '::' . $method, FNM_NOESCAPE) + || ($lineNumber !== null && fnmatch($ignorePattern, $class . '::' . $method . '::' . $lineNumber, FNM_NOESCAPE)) + ) { return true; } } diff --git a/tests/Mutator/Util/MutatorConfigTest.php b/tests/Mutator/Util/MutatorConfigTest.php index e766b6a7d..617d57848 100644 --- a/tests/Mutator/Util/MutatorConfigTest.php +++ b/tests/Mutator/Util/MutatorConfigTest.php @@ -46,11 +46,11 @@ final class MutatorConfigTest extends TestCase /** * @dataProvider providesIgnoredValues */ - public function test_is_ignored_returns_true_if_there_is_a_match(array $ignored, string $class, string $method): void + public function test_is_ignored_returns_true_if_there_is_a_match(array $ignored, string $class, string $method, int $lineNumber = null): void { $config = new MutatorConfig(['ignore' => $ignored]); - $this->assertTrue($config->isIgnored($class, $method)); + $this->assertTrue($config->isIgnored($class, $method, $lineNumber)); } public function providesIgnoredValues(): \Generator @@ -90,6 +90,13 @@ public function providesIgnoredValues(): \Generator 'Foo\Bar\Test', 'method', ]; + + yield 'It ignores a specific line number' => [ + ['Foo\Bar\Test::method::63'], + 'Foo\Bar\Test', + 'method', + 63, + ]; } /**