aboutsummaryrefslogtreecommitdiffstats
path: root/includes
diff options
context:
space:
mode:
Diffstat (limited to 'includes')
-rw-r--r--includes/utils/ClassCollector.php25
1 files changed, 25 insertions, 0 deletions
diff --git a/includes/utils/ClassCollector.php b/includes/utils/ClassCollector.php
index c987354d3737..12b8a707bd6f 100644
--- a/includes/utils/ClassCollector.php
+++ b/includes/utils/ClassCollector.php
@@ -59,6 +59,31 @@ class ClassCollector {
$this->alias = null;
$this->tokens = [];
+ // HACK: The PHP tokenizer is slow (T225730).
+ // Speed it up by reducing the input to the three kinds of statement we care about:
+ // - namespace X;
+ // - [final] [abstract] class X … {}
+ // - class_alias( … );
+ $lines = [];
+ $matches = null;
+ preg_match_all(
+ // phpcs:ignore Generic.Files.LineLength.TooLong
+ '#^\t*(?:namespace |(final )?(abstract )?(class|interface|trait) |class_alias\()[^;{]+[;{]\s*\}?#m',
+ $code,
+ $matches
+ );
+ if ( isset( $matches[0][0] ) ) {
+ foreach ( $matches[0] as $match ) {
+ $match = trim( $match );
+ if ( substr( $match, -1 ) === '{' ) {
+ // Keep it balanced
+ $match .= '}';
+ }
+ $lines[] = $match;
+ }
+ }
+ $code = '<?php ' . implode( "\n", $lines ) . "\n";
+
foreach ( token_get_all( $code ) as $token ) {
if ( $this->startToken === null ) {
$this->tryBeginExpect( $token );