X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=blobdiff_plain;f=includes%2Futils%2FAutoloadGenerator.php;h=1dac0b152aa4a15c2d0ba26420c7b2431cfded19;hp=aada0136664e6b95dfca7ab82c23bfd953ab24f1;hb=c584722cc2e3d33edae58d46c2149063b3fc6d72;hpb=12bcf649144d4f2b060d1d7c818b70bdceb47910 diff --git a/includes/utils/AutoloadGenerator.php b/includes/utils/AutoloadGenerator.php index aada013666..1dac0b152a 100644 --- a/includes/utils/AutoloadGenerator.php +++ b/includes/utils/AutoloadGenerator.php @@ -152,7 +152,7 @@ class AutoloadGenerator { ksort( $json[$key] ); // Return the whole JSON file - return FormatJson::encode( $json, true ) . "\n"; + return FormatJson::encode( $json, "\t", FormatJson::ALL_OK ) . "\n"; } /** @@ -291,13 +291,6 @@ EOD; foreach ( glob( $this->basepath . '/*.php' ) as $file ) { $this->readFile( $file ); } - - // Legacy aliases (1.28) - $this->forceClassPath( 'DatabaseBase', - $this->basepath . '/includes/libs/rdbms/database/Database.php' ); - // Legacy aliases (1.29) - $this->forceClassPath( 'Blob', - $this->basepath . '/includes/libs/rdbms/encasing/Blob.php' ); } } @@ -326,6 +319,11 @@ class ClassCollector { */ protected $tokens; + /** + * @var array Class alias with target/name fields + */ + protected $alias; + /** * @var string $code PHP code (including namespace = ''; $this->classes = []; $this->startToken = null; + $this->alias = null; $this->tokens = []; foreach ( token_get_all( $code ) as $token ) { @@ -356,6 +355,8 @@ class ClassCollector { if ( is_string( $token ) ) { return; } + // Note: When changing class name discovery logic, + // AutoLoaderTest.php may also need to be updated. switch ( $token[0] ) { case T_NAMESPACE: case T_CLASS: @@ -363,6 +364,12 @@ class ClassCollector { case T_TRAIT: case T_DOUBLE_COLON: $this->startToken = $token; + break; + case T_STRING: + if ( $token[1] === 'class_alias' ) { + $this->startToken = $token; + $this->alias = []; + } } } @@ -386,6 +393,58 @@ class ClassCollector { } break; + case T_STRING: + if ( $this->alias !== null ) { + // Flow 1 - Two string literals: + // - T_STRING class_alias + // - '(' + // - T_CONSTANT_ENCAPSED_STRING 'TargetClass' + // - ',' + // - T_WHITESPACE + // - T_CONSTANT_ENCAPSED_STRING 'AliasName' + // - ')' + // Flow 2 - Use of ::class syntax for first parameter + // - T_STRING class_alias + // - '(' + // - T_STRING TargetClass + // - T_DOUBLE_COLON :: + // - T_CLASS class + // - ',' + // - T_WHITESPACE + // - T_CONSTANT_ENCAPSED_STRING 'AliasName' + // - ')' + if ( $token === '(' ) { + // Start of a function call to class_alias() + $this->alias = [ 'target' => false, 'name' => false ]; + } elseif ( $token === ',' ) { + // Record that we're past the first parameter + if ( $this->alias['target'] === false ) { + $this->alias['target'] = true; + } + } elseif ( is_array( $token ) && $token[0] === T_CONSTANT_ENCAPSED_STRING ) { + if ( $this->alias['target'] === true ) { + // We already saw a first argument, this must be the second. + // Strip quotes from the string literal. + $this->alias['name'] = substr( $token[1], 1, -1 ); + } + } elseif ( $token === ')' ) { + // End of function call + $this->classes[] = $this->alias['name']; + $this->alias = null; + $this->startToken = null; + } elseif ( !is_array( $token ) || ( + $token[0] !== T_STRING && + $token[0] !== T_DOUBLE_COLON && + $token[0] !== T_CLASS && + $token[0] !== T_WHITESPACE + ) ) { + // Ignore this call to class_alias() - compat/Timestamp.php + $this->alias = null; + $this->startToken = null; + } + } + break; + case T_CLASS: case T_INTERFACE: case T_TRAIT: