From 81ff7f18a0de248369403e0fd6bfca2e7e03b308 Mon Sep 17 00:00:00 2001
From: Alexander Schnitzler <git@alexanderschnitzler.de>
Date: Sat, 26 Sep 2020 19:31:23 +0200
Subject: [PATCH] [TASK] Fix phpstan checkFunctionArgumentTypes errors in
 ext:fluid

This patch fixes incompatible type usage in function arguments
and is preparatory work for introducing native type hints and
strict mode in all core files.

Resolves: #92167
Releases: master, 10.4
Change-Id: Ie0e82554801f505b19621434d527f341d07a9a12
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/65911
Tested-by: TYPO3com <noreply@typo3.com>
Tested-by: Daniel Goerz <daniel.goerz@posteo.de>
Tested-by: Benni Mack <benni@typo3.org>
Reviewed-by: Daniel Goerz <daniel.goerz@posteo.de>
Reviewed-by: Oliver Klee <typo3-coding@oliverklee.de>
Reviewed-by: Benni Mack <benni@typo3.org>
---
 .../fluid/Classes/Core/Rendering/RenderingContext.php     | 5 ++++-
 .../Classes/Core/Widget/AbstractWidgetViewHelper.php      | 2 +-
 .../fluid/Classes/ViewHelpers/Be/PageInfoViewHelper.php   | 3 +--
 .../fluid/Classes/ViewHelpers/Be/PagePathViewHelper.php   | 7 ++++---
 .../fluid/Classes/ViewHelpers/CObjectViewHelper.php       | 4 ++--
 .../ViewHelpers/Form/AbstractFormFieldViewHelper.php      | 2 +-
 .../fluid/Classes/ViewHelpers/Form/SelectViewHelper.php   | 8 ++++----
 typo3/sysext/fluid/Classes/ViewHelpers/FormViewHelper.php | 1 +
 .../fluid/Classes/ViewHelpers/Format/DateViewHelper.php   | 4 ++--
 .../sysext/fluid/Classes/ViewHelpers/MediaViewHelper.php  | 5 ++---
 .../fluid/Classes/ViewHelpers/Widget/LinkViewHelper.php   | 2 +-
 .../fluid/Classes/ViewHelpers/Widget/UriViewHelper.php    | 2 +-
 12 files changed, 24 insertions(+), 21 deletions(-)

diff --git a/typo3/sysext/fluid/Classes/Core/Rendering/RenderingContext.php b/typo3/sysext/fluid/Classes/Core/Rendering/RenderingContext.php
index f16b59a50a05..189469c083b9 100644
--- a/typo3/sysext/fluid/Classes/Core/Rendering/RenderingContext.php
+++ b/typo3/sysext/fluid/Classes/Core/Rendering/RenderingContext.php
@@ -26,6 +26,7 @@ use TYPO3Fluid\Fluid\Core\Compiler\TemplateCompiler;
 use TYPO3Fluid\Fluid\Core\Parser\Configuration;
 use TYPO3Fluid\Fluid\Core\Parser\InterceptorInterface;
 use TYPO3Fluid\Fluid\Core\Parser\TemplateParser;
+use TYPO3Fluid\Fluid\Core\Parser\TemplateProcessorInterface;
 use TYPO3Fluid\Fluid\Core\Variables\StandardVariableProvider;
 use TYPO3Fluid\Fluid\Core\ViewHelper\ViewHelperInvoker;
 use TYPO3Fluid\Fluid\Core\ViewHelper\ViewHelperVariableContainer;
@@ -87,7 +88,9 @@ class RenderingContext extends \TYPO3Fluid\Fluid\Core\Rendering\RenderingContext
 
         $objectManager = GeneralUtility::makeInstance(ObjectManager::class);
         if (method_exists($this, 'setTemplateProcessors')) {
-            $this->setTemplateProcessors(array_map([$objectManager, 'get'], $GLOBALS['TYPO3_CONF_VARS']['SYS']['fluid']['preProcessors']));
+            /** @var TemplateProcessorInterface[] $processors */
+            $processors = array_map([$objectManager, 'get'], $GLOBALS['TYPO3_CONF_VARS']['SYS']['fluid']['preProcessors']);
+            $this->setTemplateProcessors($processors);
         }
         $this->setExpressionNodeTypes($GLOBALS['TYPO3_CONF_VARS']['SYS']['fluid']['expressionNodeTypes']);
         $this->setTemplatePaths($objectManager->get(TemplatePaths::class));
diff --git a/typo3/sysext/fluid/Classes/Core/Widget/AbstractWidgetViewHelper.php b/typo3/sysext/fluid/Classes/Core/Widget/AbstractWidgetViewHelper.php
index b82470007820..9b9c318d8c62 100644
--- a/typo3/sysext/fluid/Classes/Core/Widget/AbstractWidgetViewHelper.php
+++ b/typo3/sysext/fluid/Classes/Core/Widget/AbstractWidgetViewHelper.php
@@ -171,7 +171,7 @@ abstract class AbstractWidgetViewHelper extends AbstractViewHelper
     {
         $this->widgetContext->setWidgetConfiguration($this->getWidgetConfiguration());
         $this->initializeWidgetIdentifier();
-        $this->widgetContext->setControllerObjectName(get_class($this->controller));
+        $this->widgetContext->setControllerObjectName($this->controller === null ? 'null' : get_class($this->controller));
         $extensionName = $this->renderingContext->getControllerContext()->getRequest()->getControllerExtensionName();
         $pluginName = $this->renderingContext->getControllerContext()->getRequest()->getPluginName();
         $this->widgetContext->setParentExtensionName($extensionName);
diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/Be/PageInfoViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/Be/PageInfoViewHelper.php
index cd5eaaa77fda..d91c1db0cbea 100644
--- a/typo3/sysext/fluid/Classes/ViewHelpers/Be/PageInfoViewHelper.php
+++ b/typo3/sysext/fluid/Classes/ViewHelpers/Be/PageInfoViewHelper.php
@@ -73,9 +73,8 @@ class PageInfoViewHelper extends AbstractBackendViewHelper
         $id = GeneralUtility::_GP('id');
         $pageRecord = BackendUtility::readPageAccess($id, $GLOBALS['BE_USER']->getPagePermsClause(Permission::PAGE_SHOW));
         // Add icon with context menu, etc:
-        /** @var IconFactory $iconFactory */
         $iconFactory = GeneralUtility::makeInstance(IconFactory::class);
-        if ($pageRecord['uid']) {
+        if (is_array($pageRecord) && $pageRecord['uid']) {
             // If there IS a real page
             $altText = BackendUtility::getRecordIconAltText($pageRecord, 'pages');
             $theIcon = '<span title="' . $altText . '">' . $iconFactory->getIconForRecord('pages', $pageRecord, Icon::SIZE_SMALL)->render() . '</span>';
diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/Be/PagePathViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/Be/PagePathViewHelper.php
index e7e5760499b5..581525dc3507 100644
--- a/typo3/sysext/fluid/Classes/ViewHelpers/Be/PagePathViewHelper.php
+++ b/typo3/sysext/fluid/Classes/ViewHelpers/Be/PagePathViewHelper.php
@@ -72,15 +72,16 @@ class PagePathViewHelper extends AbstractBackendViewHelper
         $id = GeneralUtility::_GP('id');
         $pageRecord = BackendUtility::readPageAccess($id, $GLOBALS['BE_USER']->getPagePermsClause(Permission::PAGE_SHOW));
         // Is this a real page
-        if ($pageRecord['uid']) {
-            $title = $pageRecord['_thePathFull'];
+        if ($pageRecord['_thePathFull'] ?? false) {
+            $title = (string)$pageRecord['_thePathFull'];
         } else {
-            $title = $GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename'];
+            $title = (string)$GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename'];
         }
         // Setting the path of the page
         $pagePath = htmlspecialchars(static::getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.path')) . ': <span class="typo3-docheader-pagePath">';
         // crop the title to title limit (or 50, if not defined)
         $cropLength = empty($GLOBALS['BE_USER']->uc['titleLen']) ? 50 : $GLOBALS['BE_USER']->uc['titleLen'];
+        $cropLength = (int)$cropLength;
         $croppedTitle = GeneralUtility::fixed_lgd_cs($title, -$cropLength);
         if ($croppedTitle !== $title) {
             $pagePath .= '<abbr title="' . htmlspecialchars($title) . '">' . htmlspecialchars($croppedTitle) . '</abbr>';
diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/CObjectViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/CObjectViewHelper.php
index a5a4ae71154d..5c31b5e0b6d1 100644
--- a/typo3/sysext/fluid/Classes/ViewHelpers/CObjectViewHelper.php
+++ b/typo3/sysext/fluid/Classes/ViewHelpers/CObjectViewHelper.php
@@ -155,7 +155,7 @@ class CObjectViewHelper extends AbstractViewHelper
             $contentObjectRenderer->setCurrentVal($data[$currentValueKey]);
         }
         $pathSegments = GeneralUtility::trimExplode('.', $typoscriptObjectPath);
-        $lastSegment = array_pop($pathSegments);
+        $lastSegment = (string)array_pop($pathSegments);
         $setup = static::getConfigurationManager()->getConfiguration(ConfigurationManagerInterface::CONFIGURATION_TYPE_FULL_TYPOSCRIPT);
         foreach ($pathSegments as $segment) {
             if (!array_key_exists($segment . '.', $setup)) {
@@ -226,7 +226,7 @@ class CObjectViewHelper extends AbstractViewHelper
                 $site = reset($sites);
             }
             $language = $globalRequest->getAttribute('language') ?? $site->getDefaultLanguage();
-            $pageArguments = $globalRequest->getAttribute('routing') ?? new PageArguments(0, 0, []);
+            $pageArguments = $globalRequest->getAttribute('routing') ?? new PageArguments(0, '0', []);
             $tsfe = GeneralUtility::makeInstance(
                 TypoScriptFrontendController::class,
                 GeneralUtility::makeInstance(Context::class),
diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/Form/AbstractFormFieldViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/Form/AbstractFormFieldViewHelper.php
index ab320384e944..cc1f792b30a3 100644
--- a/typo3/sysext/fluid/Classes/ViewHelpers/Form/AbstractFormFieldViewHelper.php
+++ b/typo3/sysext/fluid/Classes/ViewHelpers/Form/AbstractFormFieldViewHelper.php
@@ -230,7 +230,7 @@ abstract class AbstractFormFieldViewHelper extends AbstractFormViewHelper
      */
     protected function getLastSubmittedFormData()
     {
-        $propertyPath = rtrim(preg_replace('/(\\]\\[|\\[|\\])/', '.', $this->getNameWithoutPrefix()), '.');
+        $propertyPath = rtrim(preg_replace('/(\\]\\[|\\[|\\])/', '.', $this->getNameWithoutPrefix()) ?? '', '.');
         $value = ObjectAccess::getPropertyPath(
             $this->renderingContext->getControllerContext()->getRequest()->getOriginalRequest()->getArguments(),
             $propertyPath
diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/Form/SelectViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/Form/SelectViewHelper.php
index d702109c4dc6..f91f0087c57e 100644
--- a/typo3/sysext/fluid/Classes/ViewHelpers/Form/SelectViewHelper.php
+++ b/typo3/sysext/fluid/Classes/ViewHelpers/Form/SelectViewHelper.php
@@ -243,15 +243,15 @@ class SelectViewHelper extends AbstractFormFieldViewHelper
                         if (method_exists($key, '__toString')) {
                             $key = (string)$key;
                         } else {
-                            throw new Exception('Identifying value for object of class "' . get_class($value) . '" was an object.', 1247827428);
+                            throw new Exception('Identifying value for object of class "' . (is_object($value) ? get_class($value) : gettype($value)) . '" was an object.', 1247827428);
                         }
                     }
                 } elseif ($this->persistenceManager->getIdentifierByObject($value) !== null) {
                     // @todo use $this->persistenceManager->isNewObject() once it is implemented
                     $key = $this->persistenceManager->getIdentifierByObject($value);
-                } elseif (method_exists($value, '__toString')) {
+                } elseif (is_object($value) && method_exists($value, '__toString')) {
                     $key = (string)$value;
-                } else {
+                } elseif (is_object($value)) {
                     throw new Exception('No identifying value for object of class "' . get_class($value) . '" found.', 1247826696);
                 }
                 if ($this->hasArgument('optionLabelField')) {
@@ -263,7 +263,7 @@ class SelectViewHelper extends AbstractFormFieldViewHelper
                             throw new Exception('Label value for object of class "' . get_class($value) . '" was an object without a __toString() method.', 1247827553);
                         }
                     }
-                } elseif (method_exists($value, '__toString')) {
+                } elseif (is_object($value) && method_exists($value, '__toString')) {
                     $value = (string)$value;
                 } elseif ($this->persistenceManager->getIdentifierByObject($value) !== null) {
                     // @todo use $this->persistenceManager->isNewObject() once it is implemented
diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/FormViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/FormViewHelper.php
index edb3cf27825d..bb6e54b64f51 100644
--- a/typo3/sysext/fluid/Classes/ViewHelpers/FormViewHelper.php
+++ b/typo3/sysext/fluid/Classes/ViewHelpers/FormViewHelper.php
@@ -414,6 +414,7 @@ class FormViewHelper extends AbstractFormViewHelper
     {
         if (count($arguments)) {
             foreach ($arguments as $argumentName => $argumentValue) {
+                $argumentName = (string)$argumentName;
                 if (is_array($argumentValue)) {
                     $prefix = $level == 0 ? $argumentName : $currentPrefix . '[' . $argumentName . ']';
                     $this->postProcessUriArgumentsForRequestHash($argumentValue, $results, $prefix, $level + 1);
diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/Format/DateViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/Format/DateViewHelper.php
index d9f152045ce0..78b068220083 100644
--- a/typo3/sysext/fluid/Classes/ViewHelpers/Format/DateViewHelper.php
+++ b/typo3/sysext/fluid/Classes/ViewHelpers/Format/DateViewHelper.php
@@ -155,7 +155,7 @@ class DateViewHelper extends AbstractViewHelper
 
         if (!$date instanceof \DateTimeInterface) {
             try {
-                $base = $base instanceof \DateTimeInterface ? $base->format('U') : strtotime((MathUtility::canBeInterpretedAsInteger($base) ? '@' : '') . $base);
+                $base = $base instanceof \DateTimeInterface ? (int)$base->format('U') : (int)strtotime((MathUtility::canBeInterpretedAsInteger($base) ? '@' : '') . $base);
                 $dateTimestamp = strtotime((MathUtility::canBeInterpretedAsInteger($date) ? '@' : '') . $date, $base);
                 $date = new \DateTime('@' . $dateTimestamp);
                 $date->setTimezone(new \DateTimeZone(date_default_timezone_get()));
@@ -165,7 +165,7 @@ class DateViewHelper extends AbstractViewHelper
         }
 
         if (strpos($format, '%') !== false) {
-            return strftime($format, $date->format('U'));
+            return strftime($format, (int)$date->format('U'));
         }
         return $date->format($format);
     }
diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/MediaViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/MediaViewHelper.php
index 940d2bf781b9..48e41dd8b7ca 100644
--- a/typo3/sysext/fluid/Classes/ViewHelpers/MediaViewHelper.php
+++ b/typo3/sysext/fluid/Classes/ViewHelpers/MediaViewHelper.php
@@ -20,7 +20,6 @@ use TYPO3\CMS\Core\Resource\FileInterface;
 use TYPO3\CMS\Core\Resource\FileReference;
 use TYPO3\CMS\Core\Resource\Rendering\RendererRegistry;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
-use TYPO3\CMS\Extbase\Domain\Model\AbstractFileFolder;
 use TYPO3\CMS\Extbase\Service\ImageService;
 use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractTagBasedViewHelper;
 
@@ -109,8 +108,8 @@ class MediaViewHelper extends AbstractTagBasedViewHelper
             $file = $file->getOriginalResource();
         }
 
-        if (!($file instanceof FileInterface || $file instanceof AbstractFileFolder)) {
-            throw new \UnexpectedValueException('Supplied file object type ' . get_class($file) . ' must be FileInterface or AbstractFileFolder.', 1454252193);
+        if (!$file instanceof FileInterface) {
+            throw new \UnexpectedValueException('Supplied file object type ' . get_class($file) . ' must be FileInterface.', 1454252193);
         }
 
         $fileRenderer = RendererRegistry::getInstance()->getRenderer($file);
diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/Widget/LinkViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/Widget/LinkViewHelper.php
index c3b0e17979b0..ecbd5f994981 100644
--- a/typo3/sysext/fluid/Classes/ViewHelpers/Widget/LinkViewHelper.php
+++ b/typo3/sysext/fluid/Classes/ViewHelpers/Widget/LinkViewHelper.php
@@ -97,7 +97,7 @@ class LinkViewHelper extends AbstractTagBasedViewHelper
         $arguments['type'] = 7076;
         $arguments['fluid-widget-id'] = $this->renderingContext->getControllerContext()->getRequest()->getWidgetContext()->getAjaxWidgetIdentifier();
         $arguments['action'] = $action;
-        return '?' . http_build_query($arguments, null, '&');
+        return '?' . http_build_query($arguments, '', '&');
     }
 
     /**
diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/Widget/UriViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/Widget/UriViewHelper.php
index c3fc99292f6e..680e6f7e106b 100644
--- a/typo3/sysext/fluid/Classes/ViewHelpers/Widget/UriViewHelper.php
+++ b/typo3/sysext/fluid/Classes/ViewHelpers/Widget/UriViewHelper.php
@@ -87,7 +87,7 @@ class UriViewHelper extends AbstractViewHelper
         $arguments['type'] = 7076;
         $arguments['fluid-widget-id'] = $controllerContext->getRequest()->getWidgetContext()->getAjaxWidgetIdentifier();
         $arguments['action'] = $action;
-        return '?' . http_build_query($arguments, null, '&');
+        return '?' . http_build_query($arguments, '', '&');
     }
 
     /**
-- 
GitLab