From dcf5038f30b5debdd09725a85b23422b29939b72 Mon Sep 17 00:00:00 2001
From: Garvin Hicking <gh@faktor-e.de>
Date: Fri, 14 Jun 2024 13:46:33 +0200
Subject: [PATCH] [BUGFIX] Fix ExtensionScanner ignoring all lines instead of
 single one

Once the ExtensionScanner hits a '@extensionScannerIgnoreLine'
annotated code line, it internally sets a flag that is never
reset.

That causes all following lines to be ignored, not just one.

This patch will reset the property `$isCurrentLineIgnored`
to `false` again, once the annotated line has passed.

Tests are adapted to verify this behaviour.

Due to the behavioral change it is possible that the scanner
now finds more hits in third-party scanned extensions
that previously may have been ignored.

Resolves: #100702
Releases: main, 12.4
Change-Id: Ib1cbb5e7758e7e302e4395d759e8585eeff15d8e
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/84733
Tested-by: core-ci <typo3@b13.com>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
---
 .../ExtensionScanner/Php/Matcher/AbstractCoreMatcher.php    | 5 +++++
 .../Tests/Unit/ExtensionScanner/Php/CodeStatisticsTest.php  | 2 +-
 .../ExtensionScanner/Php/Fixtures/CodeStatisticsFixture.php | 1 +
 .../Php/Matcher/ArrayDimensionMatcherTest.php               | 1 +
 .../ExtensionScanner/Php/Matcher/ArrayGlobalMatcherTest.php | 1 +
 .../Php/Matcher/ClassConstantMatcherTest.php                | 1 +
 .../ExtensionScanner/Php/Matcher/ClassNameMatcherTest.php   | 1 +
 .../ExtensionScanner/Php/Matcher/ConstantMatcherTest.php    | 1 +
 .../Php/Matcher/Fixtures/ArrayDimensionMatcherFixture.php   | 6 ++++++
 .../Php/Matcher/Fixtures/ArrayGlobalMatcherFixture.php      | 6 ++++++
 .../Php/Matcher/Fixtures/ClassConstantMatcherFixture.php    | 3 +++
 .../Php/Matcher/Fixtures/ClassNameMatcherFixture.php        | 3 +++
 .../Php/Matcher/Fixtures/ConstantMatcherFixture.php         | 3 +++
 .../Php/Matcher/Fixtures/FunctionCallMatcherFixture.php     | 3 +++
 .../Fixtures/InterfaceMethodChangedMatcherFixture.php       | 2 +-
 .../Fixtures/MethodArgumentDroppedMatcherFixture.php        | 2 ++
 .../Fixtures/MethodArgumentDroppedStaticMatcherFixture.php  | 2 ++
 .../Fixtures/MethodArgumentRequiredMatcherFixture.php       | 2 ++
 .../Fixtures/MethodArgumentRequiredStaticMatcherFixture.php | 1 +
 .../Matcher/Fixtures/MethodArgumentUnusedMatcherFixture.php | 2 ++
 .../Php/Matcher/Fixtures/MethodCallMatcherFixture.php       | 2 ++
 .../Php/Matcher/Fixtures/MethodCallStaticMatcherFixture.php | 2 ++
 .../Matcher/Fixtures/PropertyExistsStaticMatcherFixture.php | 4 ++++
 .../Matcher/Fixtures/PropertyProtectedMatcherFixture.php    | 2 ++
 .../Php/Matcher/Fixtures/PropertyPublicMatcherFixture.php   | 2 ++
 .../Php/Matcher/FunctionCallMatcherTest.php                 | 1 +
 .../Php/Matcher/MethodArgumentDroppedMatcherTest.php        | 1 +
 .../Php/Matcher/MethodArgumentDroppedStaticMatcherTest.php  | 1 +
 .../Php/Matcher/MethodArgumentUnusedMatcherTest.php         | 1 +
 .../ExtensionScanner/Php/Matcher/MethodCallMatcherTest.php  | 1 +
 .../Php/Matcher/MethodCallStaticMatcherTest.php             | 1 +
 .../Php/Matcher/PropertyProtectedMatcherTest.php            | 1 +
 .../Php/Matcher/PropertyPublicMatcherTest.php               | 1 +
 33 files changed, 66 insertions(+), 2 deletions(-)

diff --git a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/AbstractCoreMatcher.php b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/AbstractCoreMatcher.php
index e1c013be637b..9fac7470bc3b 100644
--- a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/AbstractCoreMatcher.php
+++ b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/AbstractCoreMatcher.php
@@ -185,6 +185,11 @@ abstract class AbstractCoreMatcher extends NodeVisitorAbstract implements CodeSc
         if ($startLineOfNode === $this->currentCodeLine) {
             return $this->isCurrentLineIgnored;
         }
+        if ($this->isCurrentLineIgnored) {
+            // "ignoreMode" is still active, but we're past the line
+            // where it was enabled. Reset this beauty.
+            $this->isCurrentLineIgnored = false;
+        }
 
         $currentLineIsIgnored = false;
         if ($startLineOfNode !== $this->currentCodeLine) {
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/CodeStatisticsTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/CodeStatisticsTest.php
index f35a8867e4ec..8951aac93b4a 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/CodeStatisticsTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/CodeStatisticsTest.php
@@ -39,6 +39,6 @@ final class CodeStatisticsTest extends UnitTestCase
 
         self::assertTrue($subject->isFileIgnored());
         self::assertEquals(2, $subject->getNumberOfIgnoredLines());
-        self::assertEquals(6, $subject->getNumberOfEffectiveCodeLines());
+        self::assertEquals(7, $subject->getNumberOfEffectiveCodeLines());
     }
 }
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Fixtures/CodeStatisticsFixture.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Fixtures/CodeStatisticsFixture.php
index 21acd66707bb..1ae5eb4bae32 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Fixtures/CodeStatisticsFixture.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Fixtures/CodeStatisticsFixture.php
@@ -32,5 +32,6 @@ class CodeStatisticsFixture
 
         // @extensionScannerIgnoreLine
         $some = 'other ignored line';
+        $somethingNotIgnored = 'not ignored';
     }
 }
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ArrayDimensionMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ArrayDimensionMatcherTest.php
index 264678db60ef..e85c7c65eab2 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ArrayDimensionMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ArrayDimensionMatcherTest.php
@@ -51,6 +51,7 @@ final class ArrayDimensionMatcherTest extends UnitTestCase
         $expectedHitLineNumbers = [
             28,
             29,
+            40,
         ];
         $actualHitLineNumbers = [];
         foreach ($subject->getMatches() as $hit) {
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ArrayGlobalMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ArrayGlobalMatcherTest.php
index 4e4aad346126..7cf7d0c4b7cb 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ArrayGlobalMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ArrayGlobalMatcherTest.php
@@ -49,6 +49,7 @@ final class ArrayGlobalMatcherTest extends UnitTestCase
         $traverser->traverse($statements);
         $expectedHitLineNumbers = [
             28,
+            40,
         ];
         $actualHitLineNumbers = [];
         foreach ($subject->getMatches() as $hit) {
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ClassConstantMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ClassConstantMatcherTest.php
index b6d144818e53..e82e2895f986 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ClassConstantMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ClassConstantMatcherTest.php
@@ -58,6 +58,7 @@ final class ClassConstantMatcherTest extends UnitTestCase
             30,
             31,
             32,
+            41,
         ];
         $actualHitLineNumbers = [];
         foreach ($subject->getMatches() as $hit) {
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ClassNameMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ClassNameMatcherTest.php
index 8e46a0831c5d..8a7c67b964de 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ClassNameMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ClassNameMatcherTest.php
@@ -72,6 +72,7 @@ final class ClassNameMatcherTest extends UnitTestCase
             44,
             47,
             48,
+            60,
         ];
         $actualHitLineNumbers = [];
         foreach ($subject->getMatches() as $match) {
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ConstantMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ConstantMatcherTest.php
index 337f18d334db..55a75fc3c372 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ConstantMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ConstantMatcherTest.php
@@ -51,6 +51,7 @@ final class ConstantMatcherTest extends UnitTestCase
         $traverser->traverse($statements);
         $expectedHitLineNumbers = [
             28,
+            36,
         ];
         $actualHitLineNumbers = [];
         foreach ($subject->getMatches() as $hit) {
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/ArrayDimensionMatcherFixture.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/ArrayDimensionMatcherFixture.php
index 702e2573ab35..757863e26507 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/ArrayDimensionMatcherFixture.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/ArrayDimensionMatcherFixture.php
@@ -35,5 +35,11 @@ class ArrayDimensionMatcherFixture
         $foo::maxSessionDataSize;
         // @extensionScannerIgnoreLine
         $foo['maxSessionDataSize'];
+
+        // Match (again). No longer ignored.
+        $foo['bar']['maxSessionDataSize'];
+        // Ignore match (again). Done only once here for all fixtures.
+        // @extensionScannerIgnoreLine
+        $foo['bar']['maxSessionDataSize'];
     }
 }
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/ArrayGlobalMatcherFixture.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/ArrayGlobalMatcherFixture.php
index b2ada13b4229..f34615da984d 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/ArrayGlobalMatcherFixture.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/ArrayGlobalMatcherFixture.php
@@ -35,5 +35,11 @@ class ArrayGlobalMatcherFixture
         $foo['TYPO3_DB'];
         // @extensionScannerIgnoreLine
         $GLOBALS['TYPO3_DB'];
+
+        // Match (again). No longer ignored.
+        $GLOBALS['TYPO3_DB'];
+        // Ignore match (again).
+        // @extensionScannerIgnoreLine
+        $GLOBALS['TYPO3_DB'];
     }
 }
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/ClassConstantMatcherFixture.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/ClassConstantMatcherFixture.php
index fd03b968c5ce..743a44075cec 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/ClassConstantMatcherFixture.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/ClassConstantMatcherFixture.php
@@ -36,5 +36,8 @@ class ClassConstantMatcherFixture
         $foo = \My\Different\SystemEnvironmentBuilder::REQUESTTYPE_FE;
         // @extensionScannerIgnoreLine
         $foo = SystemEnvironmentBuilder::REQUESTTYPE_FE;
+
+        // Match (again). No longer ignored.
+        $foo = \TYPO3\CMS\Core\Core\SystemEnvironmentBuilder::REQUESTTYPE_FE;
     }
 }
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/ClassNameMatcherFixture.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/ClassNameMatcherFixture.php
index 8651358f3be4..aaab4c7cda17 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/ClassNameMatcherFixture.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/ClassNameMatcherFixture.php
@@ -55,5 +55,8 @@ class ClassNameMatcherFixture extends App2 implements App3, Con\Application
         \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('\\TYPO3\CMS\Backend\Console\Application')->foo();
         // @extensionScannerIgnoreLine
         $bar = \RemoveXSS::class;
+
+        // Match (again). No longer ignored.
+        $foo = new \RemoveXSS();
     }
 }
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/ConstantMatcherFixture.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/ConstantMatcherFixture.php
index 56b860241573..fdece9eabfc3 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/ConstantMatcherFixture.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/ConstantMatcherFixture.php
@@ -31,5 +31,8 @@ class ConstantMatcherFixture
         $foo = \My\Project\AClass::TYPO3_DLOG;
         // @extensionScannerIgnoreLine
         $foo = TYPO3_DLOG;
+
+        // Match (again). No longer ignored.
+        $foo = TYPO3_DLOG;
     }
 }
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/FunctionCallMatcherFixture.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/FunctionCallMatcherFixture.php
index d8a25bfd2004..dbe25a666bc2 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/FunctionCallMatcherFixture.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/FunctionCallMatcherFixture.php
@@ -38,5 +38,8 @@ class FunctionCallMatcherFixture
         debugBegin();
         // @extensionScannerIgnoreLine
         $bar->bar(\debugBegin());
+
+        // Match (again). No longer ignored.
+        \debugBegin();
     }
 }
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/InterfaceMethodChangedMatcherFixture.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/InterfaceMethodChangedMatcherFixture.php
index 4e4d15efb993..59de1d36caf4 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/InterfaceMethodChangedMatcherFixture.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/InterfaceMethodChangedMatcherFixture.php
@@ -45,8 +45,8 @@ class InterfaceMethodChangedMatcherFixture
      */
     public function like2($arg1, $arg2, $arg3): void
     {
-        // @extensionScannerIgnoreLine
         // Match: Call to ->like() with three arguments has been removed
+        // @extensionScannerIgnoreLine
         $foo->like2('arg1', 'arg2', 'arg3');
     }
 
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/MethodArgumentDroppedMatcherFixture.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/MethodArgumentDroppedMatcherFixture.php
index c04ef9fbb4a5..0a40723cc4b7 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/MethodArgumentDroppedMatcherFixture.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/MethodArgumentDroppedMatcherFixture.php
@@ -43,5 +43,7 @@ class MethodArgumentDroppedMatcherFixture
         $foo->euc_char_mapping('arg1', 'arg2');
         // @extensionScannerIgnoreLine
         $foo->euc_char_mapping('arg1', 'arg2', 'arg3');
+        // Match (again). No longer ignored.
+        $foo->euc_char_mapping('arg1', 'arg2', 'arg3');
     }
 }
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/MethodArgumentDroppedStaticMatcherFixture.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/MethodArgumentDroppedStaticMatcherFixture.php
index 081e0075371e..d0d1e79ac380 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/MethodArgumentDroppedStaticMatcherFixture.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/MethodArgumentDroppedStaticMatcherFixture.php
@@ -42,5 +42,7 @@ class MethodArgumentDroppedStaticMatcherFixture
         $foo::getFileAbsFileName(...$args1, ...$args2);
         // @extensionScannerIgnoreLine
         $foo::getFileAbsFileName('foo', 'bar');
+        // Match (again). No longer ignored.
+        \TYPO3\CMS\Core\Utility\GeneralUtility::getFileAbsFileName('foo', 'bar');
     }
 }
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/MethodArgumentRequiredMatcherFixture.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/MethodArgumentRequiredMatcherFixture.php
index 477486122b76..a66876d3fe25 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/MethodArgumentRequiredMatcherFixture.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/MethodArgumentRequiredMatcherFixture.php
@@ -43,5 +43,7 @@ class MethodArgumentRequiredMatcherFixture
         $foo::searchWhere('arg1', 'arg2', 'arg3', 'arg4', 'arg5');
         // @extensionScannerIgnoreLine
         $this->searchWhere('arg1', 'arg2');
+        // Match (again). No longer ignored.
+        \TYPO3\CMS\Core\Utility\GeneralUtility::getFileAbsFileName('foo', 'bar');
     }
 }
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/MethodArgumentRequiredStaticMatcherFixture.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/MethodArgumentRequiredStaticMatcherFixture.php
index d8dfbf672469..33ec47a58ca3 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/MethodArgumentRequiredStaticMatcherFixture.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/MethodArgumentRequiredStaticMatcherFixture.php
@@ -42,5 +42,6 @@ class MethodArgumentRequiredStaticMatcherFixture
         $foo::addNavigationComponent(...'foo');
         // @extensionScannerIgnoreLine
         ExtensionManagementUtility::addNavigationComponent('foo', 'bar');
+        // Match (again). No longer ignored.
     }
 }
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/MethodArgumentUnusedMatcherFixture.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/MethodArgumentUnusedMatcherFixture.php
index 21033edda56f..8a343295bafb 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/MethodArgumentUnusedMatcherFixture.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/MethodArgumentUnusedMatcherFixture.php
@@ -43,5 +43,7 @@ class MethodArgumentUnusedMatcherFixture
         $foo->RTE_transform(...$args1, ...$args2, ...$args3);
         // @extensionScannerIgnoreLine
         $foo->RTE_transform('arg1', 'arg2');
+        // Match (again). No longer ignored.
+        $foo->RTE_transform('arg1', 'arg2');
     }
 }
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/MethodCallMatcherFixture.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/MethodCallMatcherFixture.php
index 4dae1e09b8e4..c6e196f5fddd 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/MethodCallMatcherFixture.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/MethodCallMatcherFixture.php
@@ -58,5 +58,7 @@ class MethodCallMatcherFixture
         $foo->confirmMsg('arg1', 'arg2', 'arg3', 'arg4', 'arg5');
         // @extensionScannerIgnoreLine
         $bar->bar($foo->confirmMsg('arg1', 'arg2', 'arg3', 'arg4', 'arg5'));
+        // Match (again). No longer ignored.
+        $foo->confirmMsg('arg1', 'arg2', 'arg3', 'arg4');
     }
 }
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/MethodCallStaticMatcherFixture.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/MethodCallStaticMatcherFixture.php
index c27da73219c1..a112240bea5e 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/MethodCallStaticMatcherFixture.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/MethodCallStaticMatcherFixture.php
@@ -37,5 +37,7 @@ class MethodCallStaticMatcherFixture
         $foo->getAjaxUrl('bar');
         // @extensionScannerIgnoreLine
         $foo::getAjaxUrl('bar');
+        // Match (again). No longer ignored.
+        BackendUtility::getAjaxUrl();
     }
 }
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/PropertyExistsStaticMatcherFixture.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/PropertyExistsStaticMatcherFixture.php
index 51c42ca79820..c8c32de30705 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/PropertyExistsStaticMatcherFixture.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/PropertyExistsStaticMatcherFixture.php
@@ -47,6 +47,8 @@ class PropertyExistsStaticMatcherFixture4
     // Not a match: suppressed
     // @extensionScannerIgnoreLine
     public static $iAmAMatch;
+    // Match (again). No longer ignored.
+    public static $iAmAnUnignoredMatch;
 }
 
 class PropertyExistsStaticMatcherFixture5
@@ -58,6 +60,8 @@ class PropertyExistsStaticMatcherFixture5
      * @var string|null
      */
     public static $iAmAMatch;
+    // Match (again). No longer ignored.
+    public static $iAmAnUnignoredMatch;
 }
 
 class PropertyExistsStaticMatcherFixture6
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/PropertyProtectedMatcherFixture.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/PropertyProtectedMatcherFixture.php
index e363472a6e0f..7721ab27b176 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/PropertyProtectedMatcherFixture.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/PropertyProtectedMatcherFixture.php
@@ -45,5 +45,7 @@ class PropertyProtectedMatcherFixture
         static::$foo();
         // @extensionScannerIgnoreLine
         $foo->recUpdateAccessCache;
+        // Match (again). No longer ignored.
+        $foo->recUpdateAccessCache;
     }
 }
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/PropertyPublicMatcherFixture.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/PropertyPublicMatcherFixture.php
index e2ad010c1447..6529a423fb47 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/PropertyPublicMatcherFixture.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/PropertyPublicMatcherFixture.php
@@ -45,5 +45,7 @@ class PropertyPublicMatcherFixture
         static::$foo();
         // @extensionScannerIgnoreLine
         $foo->localizationMode;
+        // Match (again). No longer ignored.
+        $foo->localizationMode;
     }
 }
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/FunctionCallMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/FunctionCallMatcherTest.php
index 7e7259d74525..011a023d1097 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/FunctionCallMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/FunctionCallMatcherTest.php
@@ -50,6 +50,7 @@ final class FunctionCallMatcherTest extends UnitTestCase
         $traverser->traverse($statements);
         $expectedHitLineNumbers = [
             28,
+            43,
         ];
         $actualHitLineNumbers = [];
         foreach ($subject->getMatches() as $hit) {
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentDroppedMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentDroppedMatcherTest.php
index 78d0e0c428f9..8ee7213749fc 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentDroppedMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentDroppedMatcherTest.php
@@ -50,6 +50,7 @@ final class MethodArgumentDroppedMatcherTest extends UnitTestCase
         $traverser->traverse($statements);
         $expectedHitLineNumbers = [
             28,
+            47,
         ];
         $actualHitLineNumbers = [];
         foreach ($subject->getMatches() as $hit) {
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentDroppedStaticMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentDroppedStaticMatcherTest.php
index 083b114e480a..9bcc276e9f12 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentDroppedStaticMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentDroppedStaticMatcherTest.php
@@ -53,6 +53,7 @@ final class MethodArgumentDroppedStaticMatcherTest extends UnitTestCase
             30,
             32,
             34,
+            46,
         ];
         $actualHitLineNumbers = [];
         foreach ($subject->getMatches() as $hit) {
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentUnusedMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentUnusedMatcherTest.php
index f57591b5fa2b..e3e97636fe1f 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentUnusedMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentUnusedMatcherTest.php
@@ -52,6 +52,7 @@ final class MethodArgumentUnusedMatcherTest extends UnitTestCase
         $expectedHitLineNumbers = [
             28,
             29,
+            47,
         ];
         $actualHitLineNumbers = [];
         foreach ($subject->getMatches() as $hit) {
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodCallMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodCallMatcherTest.php
index 172af55b7a8f..b82c165cfa91 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodCallMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodCallMatcherTest.php
@@ -54,6 +54,7 @@ final class MethodCallMatcherTest extends UnitTestCase
             30,
             33,
             35,
+            62,
         ];
         $actualHitLineNumbers = [];
         foreach ($subject->getMatches() as $hit) {
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodCallStaticMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodCallStaticMatcherTest.php
index 616fbb561caa..512758ca73ec 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodCallStaticMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodCallStaticMatcherTest.php
@@ -55,6 +55,7 @@ final class MethodCallStaticMatcherTest extends UnitTestCase
         $expectedHitLineNumbers = [
             30,
             32,
+            41,
         ];
         $actualHitLineNumbers = [];
         foreach ($subject->getMatches() as $hit) {
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyProtectedMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyProtectedMatcherTest.php
index bd4235a7d36e..c19227f8cba2 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyProtectedMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyProtectedMatcherTest.php
@@ -50,6 +50,7 @@ final class PropertyProtectedMatcherTest extends UnitTestCase
         $traverser->traverse($statements);
         $expectedHitLineNumbers = [
             28,
+            49,
         ];
         $actualHitLineNumbers = [];
         foreach ($subject->getMatches() as $hit) {
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyPublicMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyPublicMatcherTest.php
index 0f6142226237..77818494cd5c 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyPublicMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyPublicMatcherTest.php
@@ -50,6 +50,7 @@ final class PropertyPublicMatcherTest extends UnitTestCase
         $expectedHitLineNumbers = [
             28,
             29,
+            49,
         ];
         $actualHitLineNumbers = [];
         foreach ($subject->getMatches() as $hit) {
-- 
GitLab