From b1d744768ae8fbb01e066b91380b6a3646968144 Mon Sep 17 00:00:00 2001
From: Ted Bowman <41201-tedbow@users.noreply.drupalcode.org>
Date: Thu, 23 Feb 2023 19:03:45 +0000
Subject: [PATCH] =?UTF-8?q?Issue=20#3342120=20by=20Wim=20Leers,=20yash.rod?=
 =?UTF-8?q?e,=20tedbow,=20phenaproxima:=20Fix=20PHPStan=20violations=20(ha?=
 =?UTF-8?q?ppened=20because=20PHPStan=20code=20checks=20stopped=20running?=
 =?UTF-8?q?=E2=80=A6)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../src/BatchProcessor.php                        |  2 +-
 .../src/Form/UpdaterForm.php                      |  2 +-
 .../tests/src/Traits/FormTestTrait.php            |  2 ++
 .../src/FixtureManipulator.php                    |  2 +-
 .../src/Kernel/PackageManagerKernelTestBase.php   |  5 +----
 .../tests/src/Kernel/StageOwnershipTest.php       |  1 +
 .../tests/src/Kernel/SymlinkValidatorTest.php     |  2 ++
 .../tests/src/Traits/ValidationTestTrait.php      |  5 +++++
 phpstan.neon.dist                                 |  9 +++++++++
 scripts/commit-code-check.sh                      |  7 +++----
 src/BatchProcessor.php                            |  2 +-
 src/Form/UpdaterForm.php                          |  2 +-
 src/Validation/StatusChecker.php                  |  2 +-
 src/Validator/StagedProjectsValidator.php         | 15 +++++++--------
 tests/src/Functional/ClickableHelpTest.php        |  7 +++----
 .../Kernel/StatusCheck/XdebugValidatorTest.php    |  2 +-
 16 files changed, 40 insertions(+), 27 deletions(-)
 create mode 100644 phpstan.neon.dist

diff --git a/automatic_updates_extensions/src/BatchProcessor.php b/automatic_updates_extensions/src/BatchProcessor.php
index 9dbd00f0b5..bf2f48a37a 100644
--- a/automatic_updates_extensions/src/BatchProcessor.php
+++ b/automatic_updates_extensions/src/BatchProcessor.php
@@ -96,8 +96,8 @@ final class BatchProcessor {
    * @see \Drupal\automatic_updates\Updater::stage()
    */
   public static function stage(array &$context): void {
+    $stage_id = \Drupal::service('session')->get(static::STAGE_ID_SESSION_KEY);
     try {
-      $stage_id = \Drupal::service('session')->get(static::STAGE_ID_SESSION_KEY);
       static::getUpdater()->claim($stage_id)->stage();
     }
     catch (\Throwable $e) {
diff --git a/automatic_updates_extensions/src/Form/UpdaterForm.php b/automatic_updates_extensions/src/Form/UpdaterForm.php
index 21e11646b2..dec4b3fc60 100644
--- a/automatic_updates_extensions/src/Form/UpdaterForm.php
+++ b/automatic_updates_extensions/src/Form/UpdaterForm.php
@@ -164,7 +164,7 @@ final class UpdaterForm extends UpdateFormBase {
       $results = [];
     }
     else {
-      $results = $this->runStatusCheck($this->extensionUpdater, $this->eventDispatcher, TRUE);
+      $results = $this->runStatusCheck($this->extensionUpdater, $this->eventDispatcher);
     }
     $this->displayResults($results, $this->renderer);
     $security_level = ValidationResult::getOverallSeverity($results);
diff --git a/automatic_updates_extensions/tests/src/Traits/FormTestTrait.php b/automatic_updates_extensions/tests/src/Traits/FormTestTrait.php
index af3ee30b6d..6835ddebe9 100644
--- a/automatic_updates_extensions/tests/src/Traits/FormTestTrait.php
+++ b/automatic_updates_extensions/tests/src/Traits/FormTestTrait.php
@@ -5,6 +5,7 @@ declare(strict_types = 1);
 namespace Drupal\Tests\automatic_updates_extensions\Traits;
 
 use Behat\Mink\WebAssert;
+use Drupal\Tests\BrowserTestBase;
 
 /**
  * Common methods for testing the update form.
@@ -41,6 +42,7 @@ trait FormTestTrait {
    *   The no of rows in table.
    */
   protected function assertUpdatesCount(int $expected_update_count): void {
+    assert($this instanceof BrowserTestBase);
     $this->assertSession()->elementsCount('css', '.update-recommended tbody tr', $expected_update_count);
   }
 
diff --git a/package_manager/tests/modules/fixture_manipulator/src/FixtureManipulator.php b/package_manager/tests/modules/fixture_manipulator/src/FixtureManipulator.php
index 5392844db2..e85752cdc9 100644
--- a/package_manager/tests/modules/fixture_manipulator/src/FixtureManipulator.php
+++ b/package_manager/tests/modules/fixture_manipulator/src/FixtureManipulator.php
@@ -214,7 +214,7 @@ class FixtureManipulator {
       $data['dev-package-names'] = array_values($data['dev-package-names']);
     }
     // Add the package back to the list, if we have data for it.
-    if (isset($package)) {
+    if (isset($install_json_package)) {
       $data['packages'][] = $install_json_package;
 
       if ($is_dev_requirement || !empty($is_existing_dev_package)) {
diff --git a/package_manager/tests/src/Kernel/PackageManagerKernelTestBase.php b/package_manager/tests/src/Kernel/PackageManagerKernelTestBase.php
index 6635bf52c6..95fc412280 100644
--- a/package_manager/tests/src/Kernel/PackageManagerKernelTestBase.php
+++ b/package_manager/tests/src/Kernel/PackageManagerKernelTestBase.php
@@ -276,10 +276,7 @@ abstract class PackageManagerKernelTestBase extends KernelTestBase {
 
     // This validator will persist through container rebuilds.
     // @see ::register()
-    $validator = new TestDiskSpaceValidator(
-      $path_locator,
-      $this->container->get('string_translation')
-    );
+    $validator = new TestDiskSpaceValidator($path_locator);
     // By default, the validator should report that the root, vendor, and
     // temporary directories have basically infinite free space.
     $validator->freeSpace = [
diff --git a/package_manager/tests/src/Kernel/StageOwnershipTest.php b/package_manager/tests/src/Kernel/StageOwnershipTest.php
index 27e5c310a6..a8de6438c7 100644
--- a/package_manager/tests/src/Kernel/StageOwnershipTest.php
+++ b/package_manager/tests/src/Kernel/StageOwnershipTest.php
@@ -267,6 +267,7 @@ class StageOwnershipTest extends PackageManagerKernelTestBase {
         // don't wan't to do that in this test, since we're specifically testing
         // what happens when we try to delete a stage directory with
         // write-protected files.
+        return TRUE;
       }
 
       /**
diff --git a/package_manager/tests/src/Kernel/SymlinkValidatorTest.php b/package_manager/tests/src/Kernel/SymlinkValidatorTest.php
index b753df107b..35011a8b53 100644
--- a/package_manager/tests/src/Kernel/SymlinkValidatorTest.php
+++ b/package_manager/tests/src/Kernel/SymlinkValidatorTest.php
@@ -17,6 +17,7 @@ use PhpTuf\ComposerStager\Domain\Value\Path\PathInterface;
 use PhpTuf\ComposerStager\Domain\Value\PathList\PathListInterface;
 use PHPUnit\Framework\Assert;
 use Prophecy\Argument;
+use Prophecy\Prophecy\ObjectProphecy;
 
 /**
  * @covers \Drupal\package_manager\Validator\SymlinkValidator
@@ -105,6 +106,7 @@ class SymlinkValidatorTest extends PackageManagerKernelTestBase {
       // Ensure that the Composer Stager's symlink precondition is invoked.
       $this->precondition->assertIsFulfilled(...$arguments)
         ->will(function (array $arguments) use ($symlinks_exist): void {
+          assert($this instanceof ObjectProphecy);
           // Ensure that 'ignore/me' is present in ignored paths.
           Assert::assertContains('ignore/me', $arguments[2]->getAll());
 
diff --git a/package_manager/tests/src/Traits/ValidationTestTrait.php b/package_manager/tests/src/Traits/ValidationTestTrait.php
index 035c08f7e6..c3f27a1c67 100644
--- a/package_manager/tests/src/Traits/ValidationTestTrait.php
+++ b/package_manager/tests/src/Traits/ValidationTestTrait.php
@@ -5,8 +5,10 @@ declare(strict_types = 1);
 namespace Drupal\Tests\package_manager\Traits;
 
 use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\KernelTests\KernelTestBase;
 use Drupal\package_manager\PathLocator;
 use Drupal\package_manager\ValidationResult;
+use Drupal\Tests\BrowserTestBase;
 use Drupal\Tests\UnitTestCase;
 
 /**
@@ -64,6 +66,8 @@ trait ValidationTestTrait {
    */
   protected function resolvePlaceholdersInArrayValuesWithRealPaths(array $subject, ?PathLocator $path_locator = NULL, ?string $stage_dir = NULL): array {
     if (!$path_locator) {
+      // Only kernel and browser tests have $this->container.
+      assert($this instanceof KernelTestBase || $this instanceof BrowserTestBase);
       $path_locator = $this->container->get('package_manager.path_locator');
     }
     $subject = str_replace(
@@ -97,6 +101,7 @@ trait ValidationTestTrait {
   protected function getValidationResultsAsArray(array $results): array {
     $string_translation_stub = NULL;
     if (is_a(get_called_class(), UnitTestCase::class, TRUE)) {
+      assert($this instanceof UnitTestCase);
       $string_translation_stub = $this->getStringTranslationStub();
     }
     return array_values(array_map(static function (ValidationResult $result) use ($string_translation_stub) {
diff --git a/phpstan.neon.dist b/phpstan.neon.dist
new file mode 100644
index 0000000000..fd16bd0054
--- /dev/null
+++ b/phpstan.neon.dist
@@ -0,0 +1,9 @@
+includes:
+	- %rootDir%/../../../core/phpstan.neon.dist
+
+parameters:
+  ignoreErrors:
+    # Drupal core's PHPStan config file ignores the non-anonymous variant of this.
+    - "#^Anonymous class extends @internal class#"
+  # Drupal core needs to ignore more things than we need to!
+  reportUnmatchedIgnoredErrors: false
diff --git a/scripts/commit-code-check.sh b/scripts/commit-code-check.sh
index 3c77f47f28..91d0b7bc47 100755
--- a/scripts/commit-code-check.sh
+++ b/scripts/commit-code-check.sh
@@ -95,10 +95,9 @@ print_title "[1/4] PHPCS"
 $CORE_DIRECTORY/vendor/bin/phpcs $MODULE_DIRECTORY -ps --standard="$CORE_DIRECTORY/core/phpcs.xml.dist"
 print_results $? "PHPCS"
 
-# @todo Uncomment in https://drupal.org/i/3342120
-# print_title "[2/4] PHPStan"
-# php -d apc.enabled=0 -d apc.enable_cli=0 $CORE_DIRECTORY/vendor/bin/phpstan analyze --no-progress --configuration="$CORE_DIRECTORY/core/phpstan.neon.dist" $MODULE_DIRECTORY
-# print_results $? "PHPStan"
+print_title "[2/4] PHPStan"
+php -d apc.enabled=0 -d apc.enable_cli=0 $CORE_DIRECTORY/vendor/bin/phpstan analyze --no-progress --configuration="$MODULE_DIRECTORY/phpstan.neon.dist" $MODULE_DIRECTORY
+print_results $? "PHPStan"
 
 print_title "[3/4] CSpell"
 cd $CORE_DIRECTORY/core && yarn run -s spellcheck --no-progress --root $MODULE_DIRECTORY -c .cspell.json "**" && cd -
diff --git a/src/BatchProcessor.php b/src/BatchProcessor.php
index 657d69e25b..e991f25639 100644
--- a/src/BatchProcessor.php
+++ b/src/BatchProcessor.php
@@ -106,8 +106,8 @@ final class BatchProcessor {
    * @see \Drupal\automatic_updates\Updater::stage()
    */
   public static function stage(array &$context): void {
+    $stage_id = \Drupal::service('session')->get(static::STAGE_ID_SESSION_KEY);
     try {
-      $stage_id = \Drupal::service('session')->get(static::STAGE_ID_SESSION_KEY);
       static::getUpdater()->claim($stage_id)->stage();
     }
     catch (\Throwable $e) {
diff --git a/src/Form/UpdaterForm.php b/src/Form/UpdaterForm.php
index 4a569035ec..a6212210a0 100644
--- a/src/Form/UpdaterForm.php
+++ b/src/Form/UpdaterForm.php
@@ -152,7 +152,7 @@ final class UpdaterForm extends UpdateFormBase {
       $results = [];
     }
     else {
-      $results = $this->runStatusCheck($this->updater, $this->eventDispatcher, TRUE);
+      $results = $this->runStatusCheck($this->updater, $this->eventDispatcher);
     }
     $this->displayResults($results, $this->renderer);
     $project = $project_info->getProjectInfo();
diff --git a/src/Validation/StatusChecker.php b/src/Validation/StatusChecker.php
index a8b4c5f966..c98f561c20 100644
--- a/src/Validation/StatusChecker.php
+++ b/src/Validation/StatusChecker.php
@@ -69,7 +69,7 @@ final class StatusChecker implements EventSubscriberInterface {
     else {
       $stage = $this->cronUpdater;
     }
-    $results = $this->runStatusCheck($stage, $this->eventDispatcher, TRUE);
+    $results = $this->runStatusCheck($stage, $this->eventDispatcher);
 
     $this->keyValueExpirable->setWithExpire(
       'status_check_last_run',
diff --git a/src/Validator/StagedProjectsValidator.php b/src/Validator/StagedProjectsValidator.php
index e7863e0531..1fc86f7ab9 100644
--- a/src/Validator/StagedProjectsValidator.php
+++ b/src/Validator/StagedProjectsValidator.php
@@ -103,6 +103,7 @@ final class StagedProjectsValidator implements EventSubscriberInterface {
     if ($updated_packages = array_filter($updated_packages, $filter)) {
       $staged_packages = $stage->getInstalledPackages();
 
+      $version_change_messages = [];
       foreach ($updated_packages as $name => $updated_package) {
         $version_change_messages[] = $this->t(
           "@type '@name' from @active_version to @staged_version.",
@@ -114,14 +115,12 @@ final class StagedProjectsValidator implements EventSubscriberInterface {
           ]
         );
       }
-      if (!empty($version_change_messages)) {
-        $version_change_summary = $this->formatPlural(
-          count($version_change_messages),
-          'The update cannot proceed because the following Drupal project was unexpectedly updated. Only Drupal Core updates are currently supported.',
-          'The update cannot proceed because the following Drupal projects were unexpectedly updated. Only Drupal Core updates are currently supported.'
-        );
-        $event->addError($version_change_messages, $version_change_summary);
-      }
+      $version_change_summary = $this->formatPlural(
+        count($version_change_messages),
+        'The update cannot proceed because the following Drupal project was unexpectedly updated. Only Drupal Core updates are currently supported.',
+        'The update cannot proceed because the following Drupal projects were unexpectedly updated. Only Drupal Core updates are currently supported.'
+      );
+      $event->addError($version_change_messages, $version_change_summary);
     }
   }
 
diff --git a/tests/src/Functional/ClickableHelpTest.php b/tests/src/Functional/ClickableHelpTest.php
index a87dde2e1f..685855f043 100644
--- a/tests/src/Functional/ClickableHelpTest.php
+++ b/tests/src/Functional/ClickableHelpTest.php
@@ -32,16 +32,15 @@ class ClickableHelpTest extends AutomaticUpdatesFunctionalTestBase {
     unset($this->disableValidators[array_search('package_manager.validator.composer_executable', $this->disableValidators)]);
     parent::setUp();
     $this->setReleaseMetadata(__DIR__ . '/../../../package_manager/tests/fixtures/release-history/drupal.9.8.1-security.xml');
-    $this->checkerRunnerUser = $this->createUser([
-      'administer site configuration',
-    ]);
   }
 
   /**
    * Tests if composer executable is not present then the help link clickable.
    */
   public function testHelpLinkClickable(): void {
-    $this->drupalLogin($this->checkerRunnerUser);
+    $this->drupalLogin($this->createUser([
+      'administer site configuration',
+    ]));
     $this->config('package_manager.settings')
       ->set('executables.composer', '/not/matching/path/to/composer')
       ->save();
diff --git a/tests/src/Kernel/StatusCheck/XdebugValidatorTest.php b/tests/src/Kernel/StatusCheck/XdebugValidatorTest.php
index 0a53dc20e7..f7f87dacac 100644
--- a/tests/src/Kernel/StatusCheck/XdebugValidatorTest.php
+++ b/tests/src/Kernel/StatusCheck/XdebugValidatorTest.php
@@ -50,7 +50,7 @@ class XdebugValidatorTest extends AutomaticUpdatesKernelTestBase {
     $stage->require(['drupal/random']);
     $this->assertUpdateStagedTimes(1);
     $event_dispatcher = \Drupal::service('event_dispatcher');
-    $result = $this->runStatusCheck($stage, $event_dispatcher, TRUE);
+    $result = $this->runStatusCheck($stage, $event_dispatcher);
     $this->assertSame($message->getUntranslatedString(), $result[0]->getMessages()[0]->getUntranslatedString());
     $stage->destroy(TRUE);
 
-- 
GitLab