diff --git a/Build/Scripts/annotationChecker.php b/Build/Scripts/annotationChecker.php
index b5933e24f685a11b65c87badcb4e2e71604cf24a..be593104f35fcf56c70e473493cc4f2f3402abbd 100755
--- a/Build/Scripts/annotationChecker.php
+++ b/Build/Scripts/annotationChecker.php
@@ -22,6 +22,7 @@ use PhpParser\Node;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitorAbstract;
 use PhpParser\ParserFactory;
+use PhpParser\PhpVersion;
 use Symfony\Component\Console\Output\ConsoleOutput;
 
 require_once __DIR__ . '/../../vendor/autoload.php';
@@ -102,7 +103,7 @@ class NodeVisitor extends NodeVisitorAbstract
     }
 }
 
-$parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+$parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
 
 $finder = new Symfony\Component\Finder\Finder();
 $finder->files()
diff --git a/Build/Scripts/checkNamespaceIntegrity.php b/Build/Scripts/checkNamespaceIntegrity.php
index 432f45dfb3fa71a2b1a288e1f4026402c9aae04f..a38086cc09d984ad933561b23e58edf09f391e95 100755
--- a/Build/Scripts/checkNamespaceIntegrity.php
+++ b/Build/Scripts/checkNamespaceIntegrity.php
@@ -1,5 +1,6 @@
 #!/usr/bin/env php
 <?php
+
 declare(strict_types=1);
 
 /*
@@ -20,6 +21,7 @@ use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\NodeVisitorAbstract;
 use PhpParser\ParserFactory;
+use PhpParser\PhpVersion;
 use Symfony\Component\Finder\Finder;
 
 if (PHP_SAPI !== 'cli') {
@@ -42,7 +44,7 @@ class CheckNamespaceIntegrity
             'typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/Fixtures/PropertyExistsStaticMatcherFixture.php',
         ];
         $ignoreNamespaceParts = ['Classes'];
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $files = $this->createFinder();
         $invalidNamespaces = [];
         foreach ($files as $file) {
diff --git a/Build/Scripts/splitAcceptanceTests.php b/Build/Scripts/splitAcceptanceTests.php
index a936d96bc576a05283f9985a844b164b40a150f8..f6327dd61c63476a7be583edb8354e4bfd37715d 100755
--- a/Build/Scripts/splitAcceptanceTests.php
+++ b/Build/Scripts/splitAcceptanceTests.php
@@ -21,6 +21,7 @@ use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\NodeVisitorAbstract;
 use PhpParser\ParserFactory;
+use PhpParser\PhpVersion;
 use Symfony\Component\Console\Input\ArgvInput;
 use Symfony\Component\Console\Input\InputArgument;
 use Symfony\Component\Console\Input\InputDefinition;
@@ -93,7 +94,7 @@ class SplitAcceptanceTests extends NodeVisitorAbstract
             ->sortByName()
         ;
 
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $testStats = [];
         foreach ($testFiles as $file) {
             /** @var $file SplFileInfo */
diff --git a/Build/Scripts/splitFunctionalTests.php b/Build/Scripts/splitFunctionalTests.php
index cac63e15524e98f96b0411eb261caaa5a9de4cda..ff81f33f69f0b8154c5ad0623a51cedf3bd729c2 100755
--- a/Build/Scripts/splitFunctionalTests.php
+++ b/Build/Scripts/splitFunctionalTests.php
@@ -1,5 +1,6 @@
 #!/usr/bin/env php
 <?php
+
 declare(strict_types=1);
 
 /*
@@ -20,6 +21,7 @@ use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\NodeVisitorAbstract;
 use PhpParser\ParserFactory;
+use PhpParser\PhpVersion;
 use Symfony\Component\Console\Input\ArgvInput;
 use Symfony\Component\Console\Input\InputArgument;
 use Symfony\Component\Console\Input\InputDefinition;
@@ -84,7 +86,7 @@ class SplitFunctionalTests
             ->sortByName()
         ;
 
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $testStats = [];
         foreach ($testFiles as $file) {
             /** @var $file SplFileInfo */
diff --git a/Build/Scripts/testClassFinalChecker.php b/Build/Scripts/testClassFinalChecker.php
index f3e79ced6d8cf20a4048ef423acd86381b38a14c..e429c5a688017fabc6871a22eab0deb5dfc56be5 100644
--- a/Build/Scripts/testClassFinalChecker.php
+++ b/Build/Scripts/testClassFinalChecker.php
@@ -6,6 +6,7 @@ use PhpParser\Node;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitorAbstract;
 use PhpParser\ParserFactory;
+use PhpParser\PhpVersion;
 use Symfony\Component\Console\Output\ConsoleOutput;
 
 require_once __DIR__ . '/../../vendor/autoload.php';
@@ -25,7 +26,7 @@ class NodeVisitor extends NodeVisitorAbstract
     }
 }
 
-$parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+$parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
 
 $finder = new Symfony\Component\Finder\Finder();
 $finder->files()
diff --git a/Build/Scripts/testMethodPrefixChecker.php b/Build/Scripts/testMethodPrefixChecker.php
index c9dea214062bae22282f1574a011c1c2edf19e35..ef71201e2874d51017860fa92fd6f7fa602555dd 100644
--- a/Build/Scripts/testMethodPrefixChecker.php
+++ b/Build/Scripts/testMethodPrefixChecker.php
@@ -6,6 +6,7 @@ use PhpParser\Node;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitorAbstract;
 use PhpParser\ParserFactory;
+use PhpParser\PhpVersion;
 use Symfony\Component\Console\Output\ConsoleOutput;
 
 require_once __DIR__ . '/../../vendor/autoload.php';
@@ -30,7 +31,7 @@ class NodeVisitor extends NodeVisitorAbstract
     }
 }
 
-$parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+$parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
 
 $finder = new Symfony\Component\Finder\Finder();
 $finder->files()
diff --git a/Build/phpstan/phpstan-baseline.neon b/Build/phpstan/phpstan-baseline.neon
index 1063811815f61d7adb583e46c3b83ce23e7058de..68512fd1a03d52c5ac06879a4e9665c3331b8e81 100644
--- a/Build/phpstan/phpstan-baseline.neon
+++ b/Build/phpstan/phpstan-baseline.neon
@@ -1960,131 +1960,21 @@ parameters:
 			count: 1
 			path: ../../typo3/sysext/indexed_search/Classes/Indexer.php
 
-		-
-			message: "#^Method TYPO3\\\\CMS\\\\Install\\\\ExtensionScanner\\\\Php\\\\CodeStatistics\\:\\:enterNode\\(\\) should return int\\|PhpParser\\\\Node\\|null but return statement is missing\\.$#"
-			count: 1
-			path: ../../typo3/sysext/install/Classes/ExtensionScanner/Php/CodeStatistics.php
-
-		-
-			message: "#^Method TYPO3\\\\CMS\\\\Install\\\\ExtensionScanner\\\\Php\\\\Matcher\\\\ArrayDimensionMatcher\\:\\:enterNode\\(\\) should return int\\|PhpParser\\\\Node\\|null but return statement is missing\\.$#"
-			count: 1
-			path: ../../typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ArrayDimensionMatcher.php
-
-		-
-			message: "#^Method TYPO3\\\\CMS\\\\Install\\\\ExtensionScanner\\\\Php\\\\Matcher\\\\ArrayGlobalMatcher\\:\\:enterNode\\(\\) should return int\\|PhpParser\\\\Node\\|null but return statement is missing\\.$#"
-			count: 1
-			path: ../../typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ArrayGlobalMatcher.php
-
-		-
-			message: "#^Method TYPO3\\\\CMS\\\\Install\\\\ExtensionScanner\\\\Php\\\\Matcher\\\\ClassConstantMatcher\\:\\:enterNode\\(\\) should return int\\|PhpParser\\\\Node\\|null but return statement is missing\\.$#"
-			count: 1
-			path: ../../typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ClassConstantMatcher.php
-
-		-
-			message: "#^Method TYPO3\\\\CMS\\\\Install\\\\ExtensionScanner\\\\Php\\\\Matcher\\\\ClassNameMatcher\\:\\:enterNode\\(\\) should return int\\|PhpParser\\\\Node\\|null but return statement is missing\\.$#"
-			count: 1
-			path: ../../typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ClassNameMatcher.php
-
-		-
-			message: "#^Method TYPO3\\\\CMS\\\\Install\\\\ExtensionScanner\\\\Php\\\\Matcher\\\\ConstantMatcher\\:\\:enterNode\\(\\) should return int\\|PhpParser\\\\Node\\|null but return statement is missing\\.$#"
-			count: 1
-			path: ../../typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ConstantMatcher.php
-
-		-
-			message: "#^Property PhpParser\\\\Node\\\\Expr\\\\New_\\:\\:\\$class \\(PhpParser\\\\Node\\\\Expr\\|PhpParser\\\\Node\\\\Name\\|PhpParser\\\\Node\\\\Stmt\\\\Class_\\) in isset\\(\\) is not nullable\\.$#"
-			count: 1
-			path: ../../typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ConstructorArgumentMatcher.php
-
 		-
 			message: "#^Result of \\|\\| is always true\\.$#"
 			count: 1
 			path: ../../typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ConstructorArgumentMatcher.php
 
-		-
-			message: "#^Method TYPO3\\\\CMS\\\\Install\\\\ExtensionScanner\\\\Php\\\\Matcher\\\\FunctionCallMatcher\\:\\:enterNode\\(\\) should return int\\|PhpParser\\\\Node\\|null but return statement is missing\\.$#"
-			count: 1
-			path: ../../typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/FunctionCallMatcher.php
-
-		-
-			message: "#^Property PhpParser\\\\Node\\\\Expr\\\\MethodCall\\:\\:\\$args \\(array\\<PhpParser\\\\Node\\\\Arg\\|PhpParser\\\\Node\\\\VariadicPlaceholder\\>\\) in isset\\(\\) is not nullable\\.$#"
-			count: 1
-			path: ../../typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/InterfaceMethodChangedMatcher.php
-
-		-
-			message: "#^Property PhpParser\\\\Node\\\\Stmt\\\\ClassMethod\\:\\:\\$params \\(array\\<PhpParser\\\\Node\\\\Param\\>\\) in isset\\(\\) is not nullable\\.$#"
-			count: 1
-			path: ../../typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/InterfaceMethodChangedMatcher.php
-
 		-
 			message: "#^Right side of && is always true\\.$#"
 			count: 2
 			path: ../../typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/InterfaceMethodChangedMatcher.php
 
-		-
-			message: "#^Method TYPO3\\\\CMS\\\\Install\\\\ExtensionScanner\\\\Php\\\\Matcher\\\\MethodAnnotationMatcher\\:\\:enterNode\\(\\) should return int\\|PhpParser\\\\Node\\|null but return statement is missing\\.$#"
-			count: 1
-			path: ../../typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodAnnotationMatcher.php
-
-		-
-			message: "#^Method TYPO3\\\\CMS\\\\Install\\\\ExtensionScanner\\\\Php\\\\Matcher\\\\MethodArgumentDroppedMatcher\\:\\:enterNode\\(\\) should return int\\|PhpParser\\\\Node\\|null but return statement is missing\\.$#"
-			count: 1
-			path: ../../typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodArgumentDroppedMatcher.php
-
-		-
-			message: "#^Method TYPO3\\\\CMS\\\\Install\\\\ExtensionScanner\\\\Php\\\\Matcher\\\\MethodArgumentDroppedStaticMatcher\\:\\:enterNode\\(\\) should return int\\|PhpParser\\\\Node\\|null but return statement is missing\\.$#"
-			count: 1
-			path: ../../typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodArgumentDroppedStaticMatcher.php
-
-		-
-			message: "#^Method TYPO3\\\\CMS\\\\Install\\\\ExtensionScanner\\\\Php\\\\Matcher\\\\MethodArgumentRequiredMatcher\\:\\:enterNode\\(\\) should return int\\|PhpParser\\\\Node\\|null but return statement is missing\\.$#"
-			count: 1
-			path: ../../typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodArgumentRequiredMatcher.php
-
-		-
-			message: "#^Method TYPO3\\\\CMS\\\\Install\\\\ExtensionScanner\\\\Php\\\\Matcher\\\\MethodArgumentRequiredStaticMatcher\\:\\:enterNode\\(\\) should return int\\|PhpParser\\\\Node\\|null but return statement is missing\\.$#"
-			count: 1
-			path: ../../typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodArgumentRequiredStaticMatcher.php
-
-		-
-			message: "#^Method TYPO3\\\\CMS\\\\Install\\\\ExtensionScanner\\\\Php\\\\Matcher\\\\MethodArgumentUnusedMatcher\\:\\:enterNode\\(\\) should return int\\|PhpParser\\\\Node\\|null but return statement is missing\\.$#"
-			count: 1
-			path: ../../typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodArgumentUnusedMatcher.php
-
 		-
 			message: "#^Result of \\|\\| is always true\\.$#"
 			count: 1
 			path: ../../typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodArgumentUnusedMatcher.php
 
-		-
-			message: "#^Method TYPO3\\\\CMS\\\\Install\\\\ExtensionScanner\\\\Php\\\\Matcher\\\\MethodCallMatcher\\:\\:enterNode\\(\\) should return int\\|PhpParser\\\\Node\\|null but return statement is missing\\.$#"
-			count: 1
-			path: ../../typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodCallMatcher.php
-
-		-
-			message: "#^Method TYPO3\\\\CMS\\\\Install\\\\ExtensionScanner\\\\Php\\\\Matcher\\\\MethodCallStaticMatcher\\:\\:enterNode\\(\\) should return int\\|PhpParser\\\\Node\\|null but return statement is missing\\.$#"
-			count: 1
-			path: ../../typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodCallStaticMatcher.php
-
-		-
-			message: "#^Method TYPO3\\\\CMS\\\\Install\\\\ExtensionScanner\\\\Php\\\\Matcher\\\\PropertyAnnotationMatcher\\:\\:enterNode\\(\\) should return int\\|PhpParser\\\\Node\\|null but return statement is missing\\.$#"
-			count: 1
-			path: ../../typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/PropertyAnnotationMatcher.php
-
-		-
-			message: "#^Method TYPO3\\\\CMS\\\\Install\\\\ExtensionScanner\\\\Php\\\\Matcher\\\\PropertyExistsStaticMatcher\\:\\:enterNode\\(\\) should return int\\|PhpParser\\\\Node\\|null but return statement is missing\\.$#"
-			count: 1
-			path: ../../typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/PropertyExistsStaticMatcher.php
-
-		-
-			message: "#^Method TYPO3\\\\CMS\\\\Install\\\\ExtensionScanner\\\\Php\\\\Matcher\\\\PropertyProtectedMatcher\\:\\:enterNode\\(\\) should return int\\|PhpParser\\\\Node\\|null but return statement is missing\\.$#"
-			count: 1
-			path: ../../typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/PropertyProtectedMatcher.php
-
-		-
-			message: "#^Method TYPO3\\\\CMS\\\\Install\\\\ExtensionScanner\\\\Php\\\\Matcher\\\\PropertyPublicMatcher\\:\\:enterNode\\(\\) should return int\\|PhpParser\\\\Node\\|null but return statement is missing\\.$#"
-			count: 1
-			path: ../../typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/PropertyPublicMatcher.php
-
 		-
 			message: "#^Offset string on array\\{\\} on left side of \\?\\? does not exist\\.$#"
 			count: 2
diff --git a/composer.json b/composer.json
index 8f315c926cde71565b78c71451baed0def5213d3..a22035c4fced2740404823be056c4550a028fbc1 100644
--- a/composer.json
+++ b/composer.json
@@ -62,7 +62,7 @@
 		"guzzlehttp/psr7": "^2.5.0",
 		"lolli42/finediff": "^1.1.0",
 		"masterminds/html5": "^2.7.6",
-		"nikic/php-parser": "^4.15.4",
+		"nikic/php-parser": "^5.0.1",
 		"phpdocumentor/reflection-docblock": "^5.2",
 		"phpdocumentor/type-resolver": "^1.7.1",
 		"psr/container": "^2.0",
diff --git a/composer.lock b/composer.lock
index c7bbba90fd02dcdefb4d6217956edbdd5422bbe5..60033431e3bd79cb5d842b5fa20a10645c64cba2 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "e0ada02f73054317e3d43d2ece1dec48",
+    "content-hash": "279577a4c4ca051c8fb951f61af96169",
     "packages": [
         {
             "name": "bacon/bacon-qr-code",
@@ -1274,25 +1274,27 @@
         },
         {
             "name": "nikic/php-parser",
-            "version": "v4.18.0",
+            "version": "v5.0.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/nikic/PHP-Parser.git",
-                "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999"
+                "reference": "2218c2252c874a4624ab2f613d86ac32d227bc69"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999",
-                "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999",
+                "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/2218c2252c874a4624ab2f613d86ac32d227bc69",
+                "reference": "2218c2252c874a4624ab2f613d86ac32d227bc69",
                 "shasum": ""
             },
             "require": {
+                "ext-ctype": "*",
+                "ext-json": "*",
                 "ext-tokenizer": "*",
-                "php": ">=7.0"
+                "php": ">=7.4"
             },
             "require-dev": {
                 "ircmaxell/php-yacc": "^0.0.7",
-                "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
+                "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
             },
             "bin": [
                 "bin/php-parse"
@@ -1300,7 +1302,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "4.9-dev"
+                    "dev-master": "5.0-dev"
                 }
             },
             "autoload": {
@@ -1324,9 +1326,9 @@
             ],
             "support": {
                 "issues": "https://github.com/nikic/PHP-Parser/issues",
-                "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0"
+                "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.1"
             },
-            "time": "2023-12-10T21:03:43+00:00"
+            "time": "2024-02-21T19:24:10+00:00"
         },
         {
             "name": "phpdocumentor/reflection-common",
diff --git a/typo3/sysext/install/Classes/Controller/UpgradeController.php b/typo3/sysext/install/Classes/Controller/UpgradeController.php
index 5926f49e1696758e2fd5c50793857d2785ab694b..28329b0c8832c7a69fa1eefb4d74e3aaa50e2446 100644
--- a/typo3/sysext/install/Classes/Controller/UpgradeController.php
+++ b/typo3/sysext/install/Classes/Controller/UpgradeController.php
@@ -20,6 +20,7 @@ namespace TYPO3\CMS\Install\Controller;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PhpParser\PhpVersion;
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ServerRequestInterface;
 use Symfony\Component\Finder\Finder;
@@ -738,7 +739,7 @@ class UpgradeController extends AbstractController
             );
         }
 
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         // Parse PHP file to AST and traverse tree calling visitors
         $statements = $parser->parse(file_get_contents($absoluteFilePath));
 
diff --git a/typo3/sysext/install/Classes/ExtensionScanner/Php/CodeStatistics.php b/typo3/sysext/install/Classes/ExtensionScanner/Php/CodeStatistics.php
index 79e23a4daa2d881cb4586755b0100d10e4581fba..bcb31ce6ac18893f4a68aa5cf6c57a8dc467fc39 100644
--- a/typo3/sysext/install/Classes/ExtensionScanner/Php/CodeStatistics.php
+++ b/typo3/sysext/install/Classes/ExtensionScanner/Php/CodeStatistics.php
@@ -50,10 +50,8 @@ class CodeStatistics extends NodeVisitorAbstract
 
     /**
      * Called by PhpParser during traversal.
-     *
-     * @param Node $node Incoming node
      */
-    public function enterNode(Node $node)
+    public function enterNode(Node $node): null
     {
         $startLineOfNode = $node->getAttribute('startLine');
         if ($startLineOfNode !== $this->currentLineNumber) {
@@ -84,6 +82,7 @@ class CodeStatistics extends NodeVisitorAbstract
                 }
             }
         }
+        return null;
     }
 
     /**
diff --git a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ArrayDimensionMatcher.php b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ArrayDimensionMatcher.php
index e417026916510ada11169c69bbbe605f2a070750..ce607fbb02f2dfce4839c5650eaa5f991f3bfd63 100644
--- a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ArrayDimensionMatcher.php
+++ b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ArrayDimensionMatcher.php
@@ -44,7 +44,7 @@ class ArrayDimensionMatcher extends AbstractCoreMatcher
     /**
      * Called by PhpParser.
      */
-    public function enterNode(Node $node)
+    public function enterNode(Node $node): null
     {
         if (!$this->isFileIgnored($node)
             && !$this->isLineIgnored($node)
@@ -64,6 +64,7 @@ class ArrayDimensionMatcher extends AbstractCoreMatcher
             }
             $this->matches[] = $match;
         }
+        return null;
     }
 
     /**
diff --git a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ArrayGlobalMatcher.php b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ArrayGlobalMatcher.php
index e1fe3b437e112347e5d3b4e03946ac64f2c64bf9..110d5ed496770f57147d71e40257d7f7ebb85f06 100644
--- a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ArrayGlobalMatcher.php
+++ b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ArrayGlobalMatcher.php
@@ -43,7 +43,7 @@ class ArrayGlobalMatcher extends AbstractCoreMatcher
     /**
      * Called by PhpParser.
      */
-    public function enterNode(Node $node)
+    public function enterNode(Node $node): null
     {
         if (!$this->isFileIgnored($node)
             && !$this->isLineIgnored($node)
@@ -60,5 +60,6 @@ class ArrayGlobalMatcher extends AbstractCoreMatcher
                 'indicator' => 'strong',
             ];
         }
+        return null;
     }
 }
diff --git a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ClassConstantMatcher.php b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ClassConstantMatcher.php
index bc941e958037da8b9f6ad3432c2333c346e63725..45814e58351dfe42c9deebde2c7e5f917750ff90 100644
--- a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ClassConstantMatcher.php
+++ b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ClassConstantMatcher.php
@@ -43,7 +43,7 @@ class ClassConstantMatcher extends AbstractCoreMatcher
     /**
      * Called by PhpParser.
      */
-    public function enterNode(Node $node)
+    public function enterNode(Node $node): null
     {
         if (!$this->isFileIgnored($node)
             && !$this->isLineIgnored($node)
@@ -59,5 +59,6 @@ class ClassConstantMatcher extends AbstractCoreMatcher
                 'indicator' => 'strong',
             ];
         }
+        return null;
     }
 }
diff --git a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ClassNameMatcher.php b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ClassNameMatcher.php
index e3860ffaf2f0baf69e3b25856a3894f63fd85c26..8bd356753e17295effb5a7baa869c6f15f3c760a 100644
--- a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ClassNameMatcher.php
+++ b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ClassNameMatcher.php
@@ -42,7 +42,7 @@ class ClassNameMatcher extends AbstractCoreMatcher
      *
      * @param Node $node Given node to test
      */
-    public function enterNode(Node $node)
+    public function enterNode(Node $node): null
     {
         if (!$this->isFileIgnored($node)
             && !$this->isLineIgnored($node)
@@ -58,5 +58,6 @@ class ClassNameMatcher extends AbstractCoreMatcher
                 ];
             }
         }
+        return null;
     }
 }
diff --git a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ConstantMatcher.php b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ConstantMatcher.php
index 1042c68f82d59e4cd99fa1a79af2329de9b55db4..fba38eb1ad8bb7c5a7d89cc513b0be62fe96ed58 100644
--- a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ConstantMatcher.php
+++ b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ConstantMatcher.php
@@ -42,7 +42,7 @@ class ConstantMatcher extends AbstractCoreMatcher
     /**
      * Called by PhpParser.
      */
-    public function enterNode(Node $node)
+    public function enterNode(Node $node): null
     {
         if (!$this->isFileIgnored($node)
             && !$this->isLineIgnored($node)
@@ -57,5 +57,6 @@ class ConstantMatcher extends AbstractCoreMatcher
                 'indicator' => 'strong',
             ];
         }
+        return null;
     }
 }
diff --git a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ConstructorArgumentMatcher.php b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ConstructorArgumentMatcher.php
index 4ba3ca58e8c203a23c4887d2e87d8cf3230ba944..d2979bb353edb4efaa06eec20c0845d84cd600c7 100644
--- a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ConstructorArgumentMatcher.php
+++ b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/ConstructorArgumentMatcher.php
@@ -59,10 +59,8 @@ class ConstructorArgumentMatcher extends AbstractCoreMatcher
     /**
      * Called by PhpParser.
      * Test for "->deprecated()" (weak match)
-     *
-     * @return void|null
      */
-    public function enterNode(Node $node)
+    public function enterNode(Node $node): null
     {
         if ($this->isFileIgnored($node) || $this->isLineIgnored($node)) {
             return null;
@@ -88,6 +86,7 @@ class ConstructorArgumentMatcher extends AbstractCoreMatcher
         $this->handleDroppedArguments($node, $resolvedNode);
         $this->handleCalledArguments($node, $resolvedNode);
         $this->handleUnusedArguments($node, $resolvedNode);
+        return null;
     }
 
     /**
diff --git a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/FunctionCallMatcher.php b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/FunctionCallMatcher.php
index 7507c20bb8012b67a2a11c2c18cd44fbe51c6029..cd83f14aa22d704cd2eae22bbfc7fa8d91caf9f4 100644
--- a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/FunctionCallMatcher.php
+++ b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/FunctionCallMatcher.php
@@ -43,7 +43,7 @@ class FunctionCallMatcher extends AbstractCoreMatcher
      * Called by PhpParser.
      * Test for "removedFunction()" (strong match)
      */
-    public function enterNode(Node $node)
+    public function enterNode(Node $node): null
     {
         // Match method call (not static)
         if (!$this->isFileIgnored($node)
@@ -70,5 +70,6 @@ class FunctionCallMatcher extends AbstractCoreMatcher
                 ];
             }
         }
+        return null;
     }
 }
diff --git a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/InterfaceMethodChangedMatcher.php b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/InterfaceMethodChangedMatcher.php
index 7efde9c95b33e176a803c0cb3900a529fd86eaad..85cda192d8302a989df8c54db4a4fd7d11e1de39 100644
--- a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/InterfaceMethodChangedMatcher.php
+++ b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/InterfaceMethodChangedMatcher.php
@@ -49,13 +49,11 @@ class InterfaceMethodChangedMatcher extends AbstractCoreMatcher
      * Called by PhpParser.
      * Test for "public function like($arg1, $arg2, $arg3) {}" (weak match)
      * Test for "->like($arg1, $arg2, $arg3); (weak match)
-     *
-     * @return void|null
      */
-    public function enterNode(Node $node)
+    public function enterNode(Node $node): null
     {
         if ($this->isFileIgnored($node) || $this->isLineIgnored($node)) {
-            return;
+            return null;
         }
 
         // Match method name of a class, must be public, wouldn't make sense as interface if protected/private
@@ -100,5 +98,6 @@ class InterfaceMethodChangedMatcher extends AbstractCoreMatcher
                 ];
             }
         }
+        return null;
     }
 }
diff --git a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodAnnotationMatcher.php b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodAnnotationMatcher.php
index d3657985abe599c5b625775603911bf6db29ee18..c45bb243ae9bcca1097c7d14d7f904d48be3b2bd 100644
--- a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodAnnotationMatcher.php
+++ b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodAnnotationMatcher.php
@@ -42,7 +42,7 @@ class MethodAnnotationMatcher extends AbstractCoreMatcher
      * Called by PhpParser.
      * Test for method annotations (strong match)
      */
-    public function enterNode(Node $node)
+    public function enterNode(Node $node): null
     {
         if ($node instanceof ClassMethod
             && ($docComment = $node->getDocComment()) instanceof Doc
@@ -82,5 +82,6 @@ class MethodAnnotationMatcher extends AbstractCoreMatcher
                 $this->matches[] = $match;
             }
         }
+        return null;
     }
 }
diff --git a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodArgumentDroppedMatcher.php b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodArgumentDroppedMatcher.php
index 8adf6a7217f0eb0fb1833feeafd4b5b60d3354be..dece010c51a9efd8fddfdc048d3439759e968892 100644
--- a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodArgumentDroppedMatcher.php
+++ b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodArgumentDroppedMatcher.php
@@ -45,7 +45,7 @@ class MethodArgumentDroppedMatcher extends AbstractCoreMatcher
      * Called by PhpParser.
      * Test for "->deprecated()" (weak match)
      */
-    public function enterNode(Node $node)
+    public function enterNode(Node $node): null
     {
         // Match method call (not static)
         if (!$this->isFileIgnored($node)
@@ -78,5 +78,6 @@ class MethodArgumentDroppedMatcher extends AbstractCoreMatcher
                 $this->matches[] = $match;
             }
         }
+        return null;
     }
 }
diff --git a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodArgumentDroppedStaticMatcher.php b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodArgumentDroppedStaticMatcher.php
index 4d5d3016311cc4c1f139a444ed6fe5abe8d2be2d..6a7cfab81c2e66d2fb2e2844a43dad6451a6e227 100644
--- a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodArgumentDroppedStaticMatcher.php
+++ b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodArgumentDroppedStaticMatcher.php
@@ -45,7 +45,7 @@ class MethodArgumentDroppedStaticMatcher extends AbstractCoreMatcher
      * Called by PhpParser.
      * Test for "->deprecated()" (weak match)
      */
-    public function enterNode(Node $node)
+    public function enterNode(Node $node): null
     {
         // Match static method call
         if (!$this->isFileIgnored($node)
@@ -98,5 +98,6 @@ class MethodArgumentDroppedStaticMatcher extends AbstractCoreMatcher
                 }
             }
         }
+        return null;
     }
 }
diff --git a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodArgumentRequiredMatcher.php b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodArgumentRequiredMatcher.php
index 04cc2fb20ff76f8e42b84bae80694b4a2e0d7d28..9e1d0acdc6ffb206d2bb68f165f25b6b2e02d68e 100644
--- a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodArgumentRequiredMatcher.php
+++ b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodArgumentRequiredMatcher.php
@@ -44,7 +44,7 @@ class MethodArgumentRequiredMatcher extends AbstractCoreMatcher
      * Called by PhpParser.
      * Test for "->deprecated()" (weak match)
      */
-    public function enterNode(Node $node)
+    public function enterNode(Node $node): null
     {
         // Match method call (not static)
         if (!$this->isFileIgnored($node)
@@ -78,5 +78,6 @@ class MethodArgumentRequiredMatcher extends AbstractCoreMatcher
                 $this->matches[] = $match;
             }
         }
+        return null;
     }
 }
diff --git a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodArgumentRequiredStaticMatcher.php b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodArgumentRequiredStaticMatcher.php
index f379fc616654f11fbfee56cac24a0429423cbc3d..18188819dccbf97ce831a1a46ebf72a9ff2ef1a5 100644
--- a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodArgumentRequiredStaticMatcher.php
+++ b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodArgumentRequiredStaticMatcher.php
@@ -45,7 +45,7 @@ class MethodArgumentRequiredStaticMatcher extends AbstractCoreMatcher
      * Called by PhpParser.
      * Test for "::function($1, $2, $3)" (strong match)
      */
-    public function enterNode(Node $node)
+    public function enterNode(Node $node): null
     {
         // Match static method call
         if (!$this->isFileIgnored($node)
@@ -103,5 +103,6 @@ class MethodArgumentRequiredStaticMatcher extends AbstractCoreMatcher
                 }
             }
         }
+        return null;
     }
 }
diff --git a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodArgumentUnusedMatcher.php b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodArgumentUnusedMatcher.php
index 92c4c009651a3825157aefefc038b350b8a4ce71..5221a501b14b0b98ea85f6df1ba15c38e7ffd437 100644
--- a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodArgumentUnusedMatcher.php
+++ b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodArgumentUnusedMatcher.php
@@ -46,7 +46,7 @@ class MethodArgumentUnusedMatcher extends AbstractCoreMatcher
     /**
      * Called by PhpParser.
      */
-    public function enterNode(Node $node)
+    public function enterNode(Node $node): null
     {
         // Match method call (not static)
         if (!$this->isFileIgnored($node)
@@ -85,5 +85,6 @@ class MethodArgumentUnusedMatcher extends AbstractCoreMatcher
                 $this->matches[] = $match;
             }
         }
+        return null;
     }
 }
diff --git a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodCallMatcher.php b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodCallMatcher.php
index 257ea6f9a64d062cc596ff94f0da44abefb3df08..c90a234684e494eb272d4207d30439852d633cad 100644
--- a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodCallMatcher.php
+++ b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodCallMatcher.php
@@ -44,7 +44,7 @@ class MethodCallMatcher extends AbstractCoreMatcher
      * Called by PhpParser.
      * Test for "->deprecated()" (weak match)
      */
-    public function enterNode(Node $node)
+    public function enterNode(Node $node): null
     {
         // Match method call (not static)
         if (!$this->isFileIgnored($node)
@@ -78,5 +78,6 @@ class MethodCallMatcher extends AbstractCoreMatcher
                 $this->matches[] = $match;
             }
         }
+        return null;
     }
 }
diff --git a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodCallStaticMatcher.php b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodCallStaticMatcher.php
index 6bec4df25587736d53446ad34028e4b003de90d2..196785b11c75295087dd470e606c0f45a4c081b0 100644
--- a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodCallStaticMatcher.php
+++ b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/MethodCallStaticMatcher.php
@@ -53,7 +53,7 @@ class MethodCallStaticMatcher extends AbstractCoreMatcher
      * Test for "foo\bar::deprecated()" (strong match)
      * Test for "::deprecated()" (weak match)
      */
-    public function enterNode(Node $node)
+    public function enterNode(Node $node): null
     {
         // Static call, not method call
         if (!$this->isFileIgnored($node)
@@ -101,5 +101,6 @@ class MethodCallStaticMatcher extends AbstractCoreMatcher
                 }
             }
         }
+        return null;
     }
 }
diff --git a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/PropertyAnnotationMatcher.php b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/PropertyAnnotationMatcher.php
index 1b484e2dcc6707f1795e50c35d54b25a6c11f19c..762a876de8da81c538d655e27430bdbc9a9d8e6c 100644
--- a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/PropertyAnnotationMatcher.php
+++ b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/PropertyAnnotationMatcher.php
@@ -19,8 +19,8 @@ namespace TYPO3\CMS\Install\ExtensionScanner\Php\Matcher;
 
 use PhpParser\Comment\Doc;
 use PhpParser\Node;
+use PhpParser\Node\PropertyItem;
 use PhpParser\Node\Stmt\Property;
-use PhpParser\Node\Stmt\PropertyProperty;
 
 /**
  * Find usages of property annotations
@@ -43,15 +43,15 @@ class PropertyAnnotationMatcher extends AbstractCoreMatcher
      * Called by PhpParser.
      * Test for property annotations (strong match)
      */
-    public function enterNode(Node $node)
+    public function enterNode(Node $node): null
     {
         if ($node instanceof Property
-            && ($property = reset($node->props)) instanceof PropertyProperty
+            && ($property = reset($node->props)) instanceof PropertyItem
             && ($docComment = $node->getDocComment()) instanceof Doc
             && !$this->isFileIgnored($node)
             && !$this->isLineIgnored($node)
         ) {
-            /** @var PropertyProperty $property */
+            /** @var PropertyItem $property */
             $isPossibleMatch = false;
             $match = [
                 'restFiles' => [],
@@ -85,5 +85,6 @@ class PropertyAnnotationMatcher extends AbstractCoreMatcher
                 $this->matches[] = $match;
             }
         }
+        return null;
     }
 }
diff --git a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/PropertyExistsStaticMatcher.php b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/PropertyExistsStaticMatcher.php
index 4956c1d011fcbc708df8e13249346acf5f009f93..638540f7d9c709f7210a7af179fd4286a7f427cf 100644
--- a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/PropertyExistsStaticMatcher.php
+++ b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/PropertyExistsStaticMatcher.php
@@ -41,7 +41,7 @@ class PropertyExistsStaticMatcher extends AbstractCoreMatcher
     /**
      * Called by PhpParser.
      */
-    public function enterNode(Node $node)
+    public function enterNode(Node $node): null
     {
         if (!$this->isFileIgnored($node)
             && !$this->isLineIgnored($node)
@@ -59,5 +59,6 @@ class PropertyExistsStaticMatcher extends AbstractCoreMatcher
             ];
             $this->matches[] = $match;
         }
+        return null;
     }
 }
diff --git a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/PropertyProtectedMatcher.php b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/PropertyProtectedMatcher.php
index c631e3e9e56876abec3afdbfa4368fac44bea036..59311bdc5b1461dc8b31315f9f8feb284bf2dda2 100644
--- a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/PropertyProtectedMatcher.php
+++ b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/PropertyProtectedMatcher.php
@@ -43,7 +43,7 @@ class PropertyProtectedMatcher extends AbstractCoreMatcher
     /**
      * Called by PhpParser.
      */
-    public function enterNode(Node $node)
+    public function enterNode(Node $node): null
     {
         if (!$this->isFileIgnored($node)
             && !$this->isLineIgnored($node)
@@ -64,5 +64,6 @@ class PropertyProtectedMatcher extends AbstractCoreMatcher
             }
             $this->matches[] = $match;
         }
+        return null;
     }
 }
diff --git a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/PropertyPublicMatcher.php b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/PropertyPublicMatcher.php
index 415183f54315f4079a9caf14b56c25aaa71046e7..cc51419448999e94c4ba6d9e1adf1fde0c31696d 100644
--- a/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/PropertyPublicMatcher.php
+++ b/typo3/sysext/install/Classes/ExtensionScanner/Php/Matcher/PropertyPublicMatcher.php
@@ -42,7 +42,7 @@ class PropertyPublicMatcher extends AbstractCoreMatcher
     /**
      * Called by PhpParser.
      */
-    public function enterNode(Node $node)
+    public function enterNode(Node $node): null
     {
         // Match property access (not static)
         if (!$this->isFileIgnored($node)
@@ -63,5 +63,6 @@ class PropertyPublicMatcher extends AbstractCoreMatcher
             }
             $this->matches[] = $match;
         }
+        return null;
     }
 }
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/CodeStatisticsTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/CodeStatisticsTest.php
index f35a8867e4ec8e25025be5a4c6630e9908f22289..268f1e386c8504bfc6d48cb873c4a1f89d68707c 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/CodeStatisticsTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/CodeStatisticsTest.php
@@ -19,6 +19,7 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php;
 
 use PhpParser\NodeTraverser;
 use PhpParser\ParserFactory;
+use PhpParser\PhpVersion;
 use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\CodeStatistics;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -28,7 +29,7 @@ final class CodeStatisticsTest extends UnitTestCase
     #[Test]
     public function enterNodeSumsStatistics(): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $fixtureFile = __DIR__ . '/Fixtures/CodeStatisticsFixture.php';
         $statements = $parser->parse(file_get_contents($fixtureFile));
 
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/GeneratorClassesResolverTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/GeneratorClassesResolverTest.php
index 3aa535367c6ffa6ef7099e8289c14a2caf065163..f4d3368c369a7244ae586c20cefe3161d04f61a5 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/GeneratorClassesResolverTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/GeneratorClassesResolverTest.php
@@ -24,6 +24,7 @@ use PhpParser\Node\Expr\StaticCall;
 use PhpParser\Node\Name\FullyQualified;
 use PhpParser\NodeTraverser;
 use PhpParser\ParserFactory;
+use PhpParser\PhpVersion;
 use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\GeneratorClassesResolver;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\AbstractCoreMatcher;
@@ -38,7 +39,7 @@ final class GeneratorClassesResolverTest extends UnitTestCase
 <?php
 \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Does\\Not\\Exist');
 EOC;
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $statements = $parser->parse($phpCode);
         $traverser = new NodeTraverser();
         $traverser->addVisitor(new GeneratorClassesResolver());
@@ -48,7 +49,7 @@ EOC;
         self::assertInstanceOf(StaticCall::class, $node);
         self::assertInstanceOf(ClassConstFetch::class, $argValue);
         self::assertInstanceOf(FullyQualified::class, $argValue->class);
-        self::assertEquals(['TYPO3', 'CMS', 'Does', 'Not', 'Exist'], $argValue->class->parts);
+        self::assertEquals(['TYPO3', 'CMS', 'Does', 'Not', 'Exist'], $argValue->class->getParts());
         self::assertInstanceOf(New_::class, $node->getAttribute(AbstractCoreMatcher::NODE_RESOLVED_AS));
     }
 
@@ -59,7 +60,7 @@ EOC;
 <?php
 \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Does\\Not\\' . $foo);
 EOC;
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $statements = $parser->parse($phpCode);
         $traverser = new NodeTraverser();
         $traverser->addVisitor(new GeneratorClassesResolver());
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 264678db60ef649fe1570d6facbff6bc7081bf86..b29eb41f28937f3c5a344a241be70548db880701 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ArrayDimensionMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ArrayDimensionMatcherTest.php
@@ -20,6 +20,7 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PhpParser\PhpVersion;
 use PHPUnit\Framework\Attributes\DataProvider;
 use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\ArrayDimensionMatcher;
@@ -30,7 +31,7 @@ final class ArrayDimensionMatcherTest extends UnitTestCase
     #[Test]
     public function hitsFromFixtureAreFound(): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $fixtureFile = __DIR__ . '/Fixtures/ArrayDimensionMatcherFixture.php';
         $statements = $parser->parse(file_get_contents($fixtureFile));
 
@@ -122,7 +123,7 @@ final class ArrayDimensionMatcherTest extends UnitTestCase
     #[Test]
     public function matchesReturnsExpectedRestFiles(array $configuration, string $phpCode, array $expected): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $statements = $parser->parse($phpCode);
 
         $subject = new ArrayDimensionMatcher($configuration);
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 4e4aad346126126079f3af2bdc77ab4d0cc479ac..78f8672114b92b0638b7ffd03ed661a7858d9fef 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ArrayGlobalMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ArrayGlobalMatcherTest.php
@@ -20,6 +20,7 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PhpParser\PhpVersion;
 use PHPUnit\Framework\Attributes\DataProvider;
 use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\ArrayGlobalMatcher;
@@ -30,7 +31,7 @@ final class ArrayGlobalMatcherTest extends UnitTestCase
     #[Test]
     public function hitsFromFixtureAreFound(): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $fixtureFile = __DIR__ . '/Fixtures/ArrayGlobalMatcherFixture.php';
         $statements = $parser->parse(file_get_contents($fixtureFile));
 
@@ -87,7 +88,7 @@ final class ArrayGlobalMatcherTest extends UnitTestCase
     #[Test]
     public function matchesReturnsExpectedRestFiles(array $configuration, string $phpCode, array $expected): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $statements = $parser->parse($phpCode);
 
         $subject = new ArrayGlobalMatcher($configuration);
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 b6d144818e53234183463a96eb8a319fe067f091..2d21f4b1c810a92ed77ea698d6360c62fbb0d2e9 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ClassConstantMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ClassConstantMatcherTest.php
@@ -20,6 +20,7 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PhpParser\PhpVersion;
 use PHPUnit\Framework\Attributes\DataProvider;
 use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\GeneratorClassesResolver;
@@ -31,7 +32,7 @@ final class ClassConstantMatcherTest extends UnitTestCase
     #[Test]
     public function hitsFromFixtureAreFound(): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $fixtureFile = __DIR__ . '/Fixtures/ClassConstantMatcherFixture.php';
         $statements = $parser->parse(file_get_contents($fixtureFile));
 
@@ -96,7 +97,7 @@ final class ClassConstantMatcherTest extends UnitTestCase
     #[Test]
     public function matchesReturnsExpectedRestFiles(array $configuration, string $phpCode, array $expected): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $statements = $parser->parse($phpCode);
 
         $subject = new ClassConstantMatcher($configuration);
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 8e46a0831c5d8a0d6835afdf96c2a1e1114d848e..fa8edfd831ce7fdd9d39b4e83e60e4fb1f1c71dd 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ClassNameMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ClassNameMatcherTest.php
@@ -20,6 +20,7 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PhpParser\PhpVersion;
 use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\GeneratorClassesResolver;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\ClassNameMatcher;
@@ -30,7 +31,7 @@ final class ClassNameMatcherTest extends UnitTestCase
     #[Test]
     public function hitsFromFixtureAreFound(): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $fixtureFile = __DIR__ . '/Fixtures/ClassNameMatcherFixture.php';
         $statements = $parser->parse(file_get_contents($fixtureFile));
 
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 337f18d334db4057cbd12dcf51e709327988885c..f387924f9adcde2660330c7c5b1a8f30b41bf549 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ConstantMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ConstantMatcherTest.php
@@ -20,6 +20,7 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PhpParser\PhpVersion;
 use PHPUnit\Framework\Attributes\DataProvider;
 use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\GeneratorClassesResolver;
@@ -31,7 +32,7 @@ final class ConstantMatcherTest extends UnitTestCase
     #[Test]
     public function hitsFromFixtureAreFound(): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $fixtureFile = __DIR__ . '/Fixtures/ConstantMatcherFixture.php';
         $statements = $parser->parse(file_get_contents($fixtureFile));
 
@@ -89,7 +90,7 @@ final class ConstantMatcherTest extends UnitTestCase
     #[Test]
     public function matchesReturnsExpectedRestFiles(array $configuration, string $phpCode, array $expected): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $statements = $parser->parse($phpCode);
 
         $subject = new ConstantMatcher($configuration);
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ConstructorArgumentMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ConstructorArgumentMatcherTest.php
index 040ca6a2ab249532e400a239d91b617f22cfb408..c71a31940f2fd7edf44cf0ca87ed610bbcb134f5 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ConstructorArgumentMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ConstructorArgumentMatcherTest.php
@@ -20,6 +20,7 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PhpParser\PhpVersion;
 use PHPUnit\Framework\Attributes\DataProvider;
 use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\TestCase;
@@ -78,7 +79,7 @@ final class ConstructorArgumentMatcherTest extends TestCase
     #[Test]
     public function hitsFromFixtureAreFound(array $configuration, array $expectation): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $fixtureFile = __DIR__ . '/Fixtures/ConstructorArgumentMatcherFixture.php';
         $statements = $parser->parse(file_get_contents($fixtureFile));
 
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 7e7259d74525f2e96c14f72c1e6b755bea462d5e..33221f2a955680caa78cf7e3f55539aa2bf7b206 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/FunctionCallMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/FunctionCallMatcherTest.php
@@ -20,6 +20,7 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PhpParser\PhpVersion;
 use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\FunctionCallMatcher;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -29,7 +30,7 @@ final class FunctionCallMatcherTest extends UnitTestCase
     #[Test]
     public function hitsFromFixtureAreFound(): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $fixtureFile = __DIR__ . '/Fixtures/FunctionCallMatcherFixture.php';
         $statements = $parser->parse(file_get_contents($fixtureFile));
 
@@ -77,7 +78,7 @@ class foo
 }
 EOC;
 
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $statements = $parser->parse($phpCode);
 
         $traverser = new NodeTraverser();
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/InterfaceMethodChangedMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/InterfaceMethodChangedMatcherTest.php
index c69ac7d974148cdc186d68cea7eacc27ca113870..974b0ba5ec3f66e2045abd5867077d783728f2b0 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/InterfaceMethodChangedMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/InterfaceMethodChangedMatcherTest.php
@@ -20,6 +20,7 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PhpParser\PhpVersion;
 use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\InterfaceMethodChangedMatcher;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -29,7 +30,7 @@ final class InterfaceMethodChangedMatcherTest extends UnitTestCase
     #[Test]
     public function hitsFromFixtureAreFound(): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $fixtureFile = __DIR__ . '/Fixtures/InterfaceMethodChangedMatcherFixture.php';
         $statements = $parser->parse(file_get_contents($fixtureFile));
 
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodAnnotationMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodAnnotationMatcherTest.php
index f2ed09bc07f93e0aea991b3d5870c55612dad54f..c78408977e3bed1acef420dab31629738fb40f49 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodAnnotationMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodAnnotationMatcherTest.php
@@ -20,6 +20,7 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PhpParser\PhpVersion;
 use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\MethodAnnotationMatcher;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -29,7 +30,7 @@ final class MethodAnnotationMatcherTest extends UnitTestCase
     #[Test]
     public function hitsFromFixtureAreFound(): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $fixtureFile = __DIR__ . '/Fixtures/MethodAnnotationMatcherFixture.php';
         $statements = $parser->parse(file_get_contents($fixtureFile));
 
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 78d0e0c428f99406f2b2be61bb4b3d9067ec94ea..83d967367f2a773ec30b137ad82b3dff5f4f6109 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentDroppedMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentDroppedMatcherTest.php
@@ -20,6 +20,7 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PhpParser\PhpVersion;
 use PHPUnit\Framework\Attributes\DataProvider;
 use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\MethodArgumentDroppedMatcher;
@@ -30,7 +31,7 @@ final class MethodArgumentDroppedMatcherTest extends UnitTestCase
     #[Test]
     public function hitsFromFixtureAreFound(): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $fixtureFile = __DIR__ . '/Fixtures/MethodArgumentDroppedMatcherFixture.php';
         $statements = $parser->parse(file_get_contents($fixtureFile));
 
@@ -223,7 +224,7 @@ final class MethodArgumentDroppedMatcherTest extends UnitTestCase
     #[Test]
     public function matchesReturnsExpectedRestFiles(array $configuration, string $phpCode, array $expected): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $statements = $parser->parse($phpCode);
 
         $subject = new MethodArgumentDroppedMatcher($configuration);
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 083b114e480a86b366f3f31d248f3b5a6e2e08f2..834ea3e79802ace2b4ff7529441df5d9c5490620 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentDroppedStaticMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentDroppedStaticMatcherTest.php
@@ -20,6 +20,7 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PhpParser\PhpVersion;
 use PHPUnit\Framework\Attributes\DataProvider;
 use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\MethodArgumentDroppedStaticMatcher;
@@ -30,7 +31,7 @@ final class MethodArgumentDroppedStaticMatcherTest extends UnitTestCase
     #[Test]
     public function hitsFromFixtureAreFound(): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $fixtureFile = __DIR__ . '/Fixtures/MethodArgumentDroppedStaticMatcherFixture.php';
         $statements = $parser->parse(file_get_contents($fixtureFile));
 
@@ -226,7 +227,7 @@ final class MethodArgumentDroppedStaticMatcherTest extends UnitTestCase
     #[Test]
     public function matchesReturnsExpectedRestFiles(array $configuration, string $phpCode, array $expected): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $statements = $parser->parse($phpCode);
 
         $subject = new MethodArgumentDroppedStaticMatcher($configuration);
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentRequiredMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentRequiredMatcherTest.php
index c6ac7a2b0455f2937da884b8cf858345dda96e1b..29693ad493955254e95d3a4f6ef59263111ecd36 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentRequiredMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentRequiredMatcherTest.php
@@ -20,6 +20,7 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PhpParser\PhpVersion;
 use PHPUnit\Framework\Attributes\DataProvider;
 use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\MethodArgumentRequiredMatcher;
@@ -30,7 +31,7 @@ final class MethodArgumentRequiredMatcherTest extends UnitTestCase
     #[Test]
     public function hitsFromFixtureAreFound(): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $fixtureFile = __DIR__ . '/Fixtures/MethodArgumentRequiredMatcherFixture.php';
         $statements = $parser->parse(file_get_contents($fixtureFile));
 
@@ -216,7 +217,7 @@ final class MethodArgumentRequiredMatcherTest extends UnitTestCase
     #[Test]
     public function matchesReturnsExpectedRestFiles(array $configuration, string $phpCode, array $expected): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $statements = $parser->parse($phpCode);
 
         $subject = new MethodArgumentRequiredMatcher($configuration);
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentRequiredStaticMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentRequiredStaticMatcherTest.php
index 9c92c6cc8e8152d38a99c3615a51a4ff264f1928..825928a8e4e29e62afe791da7fd2774ba5ffa146 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentRequiredStaticMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentRequiredStaticMatcherTest.php
@@ -20,6 +20,7 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PhpParser\PhpVersion;
 use PHPUnit\Framework\Attributes\DataProvider;
 use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\MethodArgumentRequiredStaticMatcher;
@@ -30,7 +31,7 @@ final class MethodArgumentRequiredStaticMatcherTest extends UnitTestCase
     #[Test]
     public function hitsFromFixtureAreFound(): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $fixtureFile = __DIR__ . '/Fixtures/MethodArgumentRequiredStaticMatcherFixture.php';
         $statements = $parser->parse(file_get_contents($fixtureFile));
 
@@ -194,7 +195,7 @@ final class MethodArgumentRequiredStaticMatcherTest extends UnitTestCase
     #[Test]
     public function matchesReturnsExpectedRestFiles(array $configuration, string $phpCode, array $expected): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $statements = $parser->parse($phpCode);
 
         $subject = new MethodArgumentRequiredStaticMatcher($configuration);
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 f57591b5fa2b1f15323416c3bc8eda5cefca66b6..e99874af178d6cf8d2df54cf6b149745597d484e 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentUnusedMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentUnusedMatcherTest.php
@@ -20,6 +20,7 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PhpParser\PhpVersion;
 use PHPUnit\Framework\Attributes\DataProvider;
 use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\MethodArgumentUnusedMatcher;
@@ -30,7 +31,7 @@ final class MethodArgumentUnusedMatcherTest extends UnitTestCase
     #[Test]
     public function hitsFromFixtureAreFound(): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $fixtureFile = __DIR__ . '/Fixtures/MethodArgumentUnusedMatcherFixture.php';
         $statements = $parser->parse(file_get_contents($fixtureFile));
 
@@ -212,7 +213,7 @@ final class MethodArgumentUnusedMatcherTest extends UnitTestCase
     #[Test]
     public function matchesReturnsExpectedRestFiles(array $configuration, string $phpCode, array $expected): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $statements = $parser->parse($phpCode);
 
         $subject = new MethodArgumentUnusedMatcher($configuration);
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 172af55b7a8f73f32830181465d1281b3b49aaa4..d386649368c5531b91d2e15f98db5e760ec51f92 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodCallMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodCallMatcherTest.php
@@ -20,6 +20,7 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PhpParser\PhpVersion;
 use PHPUnit\Framework\Attributes\DataProvider;
 use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\MethodCallMatcher;
@@ -30,7 +31,7 @@ final class MethodCallMatcherTest extends UnitTestCase
     #[Test]
     public function hitsFromFixtureAreFound(): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $fixtureFile = __DIR__ . '/Fixtures/MethodCallMatcherFixture.php';
         $statements = $parser->parse(file_get_contents($fixtureFile));
 
@@ -81,7 +82,7 @@ class foo
 }
 EOC;
 
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $statements = $parser->parse($phpCode);
 
         $traverser = new NodeTraverser();
@@ -304,7 +305,7 @@ EOC;
     #[Test]
     public function matchesReturnsExpectedRestFiles(array $configuration, string $phpCode, array $expected): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $statements = $parser->parse($phpCode);
 
         $subject = new MethodCallMatcher($configuration);
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 616fbb561caa81e2ce1dd41481c19c1d15036202..05757827cf7d6961c698270513bd26dba7af1a09 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodCallStaticMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodCallStaticMatcherTest.php
@@ -20,6 +20,7 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PhpParser\PhpVersion;
 use PHPUnit\Framework\Attributes\DataProvider;
 use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\GeneratorClassesResolver;
@@ -31,7 +32,7 @@ final class MethodCallStaticMatcherTest extends UnitTestCase
     #[Test]
     public function hitsFromFixtureAreFound(): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $fixtureFile = __DIR__ . '/Fixtures/MethodCallStaticMatcherFixture.php';
         $statements = $parser->parse(file_get_contents($fixtureFile));
 
@@ -267,7 +268,7 @@ final class MethodCallStaticMatcherTest extends UnitTestCase
     #[Test]
     public function matchesReturnsExpectedRestFiles(array $configuration, string $phpCode, array $expected): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $statements = $parser->parse($phpCode);
 
         $subject = new MethodCallStaticMatcher($configuration);
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyAnnotationMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyAnnotationMatcherTest.php
index 22c74b51437a51c6c375153faa064f4886fa806f..2870dc8a47cfc92295e02b2d5d63eaf03433af25 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyAnnotationMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyAnnotationMatcherTest.php
@@ -20,6 +20,7 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PhpParser\PhpVersion;
 use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\PropertyAnnotationMatcher;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -29,7 +30,7 @@ final class PropertyAnnotationMatcherTest extends UnitTestCase
     #[Test]
     public function hitsFromFixtureAreFound(): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $fixtureFile = __DIR__ . '/Fixtures/PropertyAnnotationMatcherFixture.php';
         $statements = $parser->parse(file_get_contents($fixtureFile));
 
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyExistsStaticMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyExistsStaticMatcherTest.php
index e62155b7d9039738bc63f35afc1fc7495f7df84b..4957261dd0cd9107399cac25f7334622250cfe8f 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyExistsStaticMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyExistsStaticMatcherTest.php
@@ -20,6 +20,7 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PhpParser\PhpVersion;
 use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\PropertyExistsStaticMatcher;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -29,7 +30,7 @@ final class PropertyExistsStaticMatcherTest extends UnitTestCase
     #[Test]
     public function hitsFromFixtureAreFound(): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $fixtureFile = __DIR__ . '/Fixtures/PropertyExistsStaticMatcherFixture.php';
         $statements = $parser->parse(file_get_contents($fixtureFile));
 
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 bd4235a7d36e39b57f79e88615e6c37c19888327..e785d395f2aa343b7a1bf0afcea7caa18c2680c1 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyProtectedMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyProtectedMatcherTest.php
@@ -20,6 +20,7 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PhpParser\PhpVersion;
 use PHPUnit\Framework\Attributes\DataProvider;
 use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\PropertyProtectedMatcher;
@@ -30,7 +31,7 @@ final class PropertyProtectedMatcherTest extends UnitTestCase
     #[Test]
     public function hitsFromFixtureAreFound(): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $fixtureFile = __DIR__ . '/Fixtures/PropertyProtectedMatcherFixture.php';
         $statements = $parser->parse(file_get_contents($fixtureFile));
 
@@ -121,7 +122,7 @@ final class PropertyProtectedMatcherTest extends UnitTestCase
     #[Test]
     public function matchesReturnsExpectedRestFiles(array $configuration, string $phpCode, array $expected): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $statements = $parser->parse($phpCode);
 
         $subject = new PropertyProtectedMatcher($configuration);
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 0f6142226237dce6726c8bfb7f05edab14b97519..4586194c3a4712820a5a68cbe00e636d035149e9 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyPublicMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyPublicMatcherTest.php
@@ -20,6 +20,7 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PhpParser\PhpVersion;
 use PHPUnit\Framework\Attributes\DataProvider;
 use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\PropertyPublicMatcher;
@@ -30,7 +31,7 @@ final class PropertyPublicMatcherTest extends UnitTestCase
     #[Test]
     public function hitsFromFixtureAreFound(): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $fixtureFile = __DIR__ . '/Fixtures/PropertyPublicMatcherFixture.php';
         $statements = $parser->parse(file_get_contents($fixtureFile));
 
@@ -121,7 +122,7 @@ final class PropertyPublicMatcherTest extends UnitTestCase
     #[Test]
     public function matchesReturnsExpectedRestFiles(array $configuration, string $phpCode, array $expected): void
     {
-        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
+        $parser = (new ParserFactory())->createForVersion(PhpVersion::fromComponents(8, 2));
         $statements = $parser->parse($phpCode);
 
         $subject = new PropertyPublicMatcher($configuration);
diff --git a/typo3/sysext/install/composer.json b/typo3/sysext/install/composer.json
index 676855d4f4f1321c01afef2f377e18e354127439..30915420faf6b7dd00190e818229ab01e1efe98a 100644
--- a/typo3/sysext/install/composer.json
+++ b/typo3/sysext/install/composer.json
@@ -21,7 +21,7 @@
 	"require": {
 		"doctrine/dbal": "^4.0",
 		"guzzlehttp/promises": "^1.5.2 || ^2.0",
-		"nikic/php-parser": "^4.15.4",
+		"nikic/php-parser": "^5.0.1",
 		"symfony/finder": "^7.0",
 		"symfony/http-foundation": "^7.0",
 		"typo3/cms-core": "13.1.*@dev",