Merge "Improve type hints in parser related classes"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 9 Jul 2019 15:11:57 +0000 (15:11 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 9 Jul 2019 15:11:57 +0000 (15:11 +0000)
1  2 
includes/parser/Parser.php

@@@ -205,9 -205,11 +205,11 @@@ class Parser 
        public $mLinkID;
        public $mIncludeSizes, $mPPNodeCount, $mGeneratedPPNodeCount, $mHighestExpansionDepth;
        public $mDefaultSort;
-       public $mTplRedirCache, $mTplDomCache, $mHeadings, $mDoubleUnderscores;
+       public $mTplRedirCache, $mHeadings, $mDoubleUnderscores;
        public $mExpensiveFunctionCount; # number of expensive parser function calls
        public $mShowToc, $mForceTocPosition;
+       /** @var array */
+       public $mTplDomCache;
  
        /**
         * @var User
                                        # The vary-revision flag must be set, because the magic word
                                        # will have a different value once the page is saved.
                                        $this->mOutput->setFlag( 'vary-revision' );
 -                                      wfDebug( __METHOD__ . ": {{PAGEID}} used in a new page, setting vary-revision...\n" );
 +                                      wfDebug( __METHOD__ . ": {{PAGEID}} used in a new page, setting vary-revision" );
                                }
                                $value = $pageid ?: null;
                                break;
                                                $value = '-';
                                        } else {
                                                $this->mOutput->setFlag( 'vary-revision-exists' );
 +                                              wfDebug( __METHOD__ . ": {{REVISIONID}} used, setting vary-revision-exists" );
                                                $value = '';
                                        }
                                } else {
                                        # Inform the edit saving system that getting the canonical output after
                                        # revision insertion requires another parse using the actual revision ID
                                        $this->mOutput->setFlag( 'vary-revision-id' );
 -                                      wfDebug( __METHOD__ . ": {{REVISIONID}} used, setting vary-revision-id...\n" );
 +                                      wfDebug( __METHOD__ . ": {{REVISIONID}} used, setting vary-revision-id" );
                                        $value = $this->getRevisionId();
                                        if ( $value === 0 ) {
                                                $rev = $this->getRevisionObject();
                                $value = $this->getRevisionTimestampSubstring( 0, 4, self::MAX_TTS, $index );
                                break;
                        case 'revisiontimestamp':
 -                              # Let the edit saving system know we should parse the page
 -                              # *after* a revision ID has been assigned. This is for null edits.
 -                              $this->mOutput->setFlag( 'vary-revision' );
 -                              wfDebug( __METHOD__ . ": {{REVISIONTIMESTAMP}} used, setting vary-revision...\n" );
 -                              $value = $this->getRevisionTimestamp();
 +                              $value = $this->getRevisionTimestampSubstring( 0, 14, self::MAX_TTS, $index );
                                break;
                        case 'revisionuser':
 -                              # Let the edit saving system know we should parse the page
 -                              # *after* a revision ID has been assigned for null edits.
 +                              # Inform the edit saving system that getting the canonical output after
 +                              # revision insertion requires a parse that used the actual user ID
                                $this->mOutput->setFlag( 'vary-user' );
 -                              wfDebug( __METHOD__ . ": {{REVISIONUSER}} used, setting vary-user...\n" );
 +                              wfDebug( __METHOD__ . ": {{REVISIONUSER}} used, setting vary-user" );
                                $value = $this->getRevisionUser();
                                break;
                        case 'revisionsize':
        /**
         * @param int $start
         * @param int $len
 -       * @param int $mtts Max time-till-save; sets vary-revision if result might change by then
 +       * @param int $mtts Max time-till-save; sets vary-revision-timestamp if result changes by then
         * @param string $variable Parser variable name
         * @return string
         */
                $resNow = substr( $this->getRevisionTimestamp(), $start, $len );
                # Possibly set vary-revision if there is not yet an associated revision
                if ( !$this->getRevisionObject() ) {
 -                      # Get the timezone-adjusted timestamp $mtts seconds in the future
 +                      # Get the timezone-adjusted timestamp $mtts seconds in the future.
 +                      # This future is relative to the current time and not that of the
 +                      # parser options. The rendered timestamp can be compared to that
 +                      # of the timestamp specified by the parser options.
                        $resThen = substr(
                                $this->contLang->userAdjust( wfTimestamp( TS_MW, time() + $mtts ), '' ),
                                $start,
                        );
  
                        if ( $resNow !== $resThen ) {
 -                              # Let the edit saving system know we should parse the page
 -                              # *after* a revision ID has been assigned. This is for null edits.
 -                              $this->mOutput->setFlag( 'vary-revision' );
 -                              wfDebug( __METHOD__ . ": $variable used, setting vary-revision...\n" );
 +                              # Inform the edit saving system that getting the canonical output after
 +                              # revision insertion requires a parse that used an actual revision timestamp
 +                              $this->mOutput->setFlag( 'vary-revision-timestamp' );
 +                              wfDebug( __METHOD__ . ": $variable used, setting vary-revision-timestamp" );
                        }
                }
  
         *  self::OT_HTML: all templates and extension tags
         *
         * @param string $text The text to transform
-        * @param bool|PPFrame $frame Object describing the arguments passed to the
+        * @param false|PPFrame|array $frame Object describing the arguments passed to the
         *   template. Arguments may also be provided as an associative array, as
         *   was the usual case before MW1.12. Providing arguments this way may be
         *   useful for extensions wishing to perform variable replacement
         *   $piece['lineStart']: whether the brace was at the start of a line
         * @param PPFrame $frame The current frame, contains template arguments
         * @throws Exception
-        * @return string The text of the template
+        * @return string|array The text of the template
         */
        public function braceSubstitution( $piece, $frame ) {
                // Flags
                                        // If we transclude ourselves, the final result
                                        // will change based on the new version of the page
                                        $this->mOutput->setFlag( 'vary-revision' );
 +                                      wfDebug( __METHOD__ . ": self transclusion, setting vary-revision" );
                                }
                        }
                }
                        'deps' => $deps ];
        }
  
 -      /**
 -       * Fetch a file and its title and register a reference to it.
 -       * If 'broken' is a key in $options then the file will appear as a broken thumbnail.
 -       * @param Title $title
 -       * @param array $options Array of options to RepoGroup::findFile
 -       * @return File|bool
 -       * @deprecated since 1.32, use fetchFileAndTitle instead
 -       */
 -      public function fetchFile( $title, $options = [] ) {
 -              wfDeprecated( __METHOD__, '1.32' );
 -              return $this->fetchFileAndTitle( $title, $options )[0];
 -      }
 -
        /**
         * Fetch a file and its title and register a reference to it.
         * If 'broken' is a key in $options then the file will appear as a broken thumbnail.
         *
         * The return value will be either:
         *   - a) Positive, indicating a specific revision ID (current or old)
 -       *   - b) Zero, meaning the revision ID specified by getCurrentRevisionCallback()
 +       *   - b) Zero, meaning the revision ID is specified by getCurrentRevisionCallback()
         *   - c) Null, meaning the parse is for preview mode and there is no revision
         *
         * @return int|null
        /**
         * Get the timestamp associated with the current revision, adjusted for
         * the default server-local timestamp
 -       * @return string
 +       * @return string TS_MW timestamp
         */
        public function getRevisionTimestamp() {
 -              if ( is_null( $this->mRevisionTimestamp ) ) {
 -                      $revObject = $this->getRevisionObject();
 -                      $timestamp = $revObject ? $revObject->getTimestamp() : wfTimestampNow();
 -
 -                      # The cryptic '' timezone parameter tells to use the site-default
 -                      # timezone offset instead of the user settings.
 -                      # Since this value will be saved into the parser cache, served
 -                      # to other users, and potentially even used inside links and such,
 -                      # it needs to be consistent for all visitors.
 -                      $this->mRevisionTimestamp = $this->contLang->userAdjust( $timestamp, '' );
 +              if ( $this->mRevisionTimestamp !== null ) {
 +                      return $this->mRevisionTimestamp;
                }
 +
 +              # Use specified revision timestamp, falling back to the current timestamp
 +              $revObject = $this->getRevisionObject();
 +              $timestamp = $revObject ? $revObject->getTimestamp() : $this->mOptions->getTimestamp();
 +              $this->mOutput->setRevisionTimestampUsed( $timestamp ); // unadjusted time zone
 +
 +              # The cryptic '' timezone parameter tells to use the site-default
 +              # timezone offset instead of the user settings.
 +              # Since this value will be saved into the parser cache, served
 +              # to other users, and potentially even used inside links and such,
 +              # it needs to be consistent for all visitors.
 +              $this->mRevisionTimestamp = $this->contLang->userAdjust( $timestamp, '' );
 +
                return $this->mRevisionTimestamp;
        }