public function readFromQueue( array $queue ) {
global $wgVersion;
$autoloadClasses = [];
+ $autoloadNamespaces = [];
$autoloaderPaths = [];
$processor = new ExtensionProcessor();
$versionChecker = new VersionChecker( $wgVersion );
$incompatible[] = "$path: unsupported manifest_version: {$version}";
}
- $autoload = $this->processAutoLoader( dirname( $path ), $info );
- // Set up the autoloader now so custom processors will work
- $GLOBALS['wgAutoloadClasses'] += $autoload;
- $autoloadClasses += $autoload;
+ $dir = dirname( $path );
+ if ( isset( $info['AutoloadClasses'] ) ) {
+ $autoload = $this->processAutoLoader( $dir, $info['AutoloadClasses'] );
+ $GLOBALS['wgAutoloadClasses'] += $autoload;
+ $autoloadClasses += $autoload;
+ }
+ if ( isset( $info['AutoloadNamespaces'] ) ) {
+ $autoloadNamespaces += $this->processAutoLoader( $dir, $info['AutoloadNamespaces'] );
+ }
// get all requirements/dependencies for this extension
$requires = $processor->getRequirements( $info );
// Get extra paths for later inclusion
$autoloaderPaths = array_merge( $autoloaderPaths,
- $processor->getExtraAutoloaderPaths( dirname( $path ), $info ) );
+ $processor->getExtraAutoloaderPaths( $dir, $info ) );
// Compatible, read and extract info
$processor->extractInfo( $path, $info, $version );
}
$data['globals']['wgAutoloadClasses'] = [];
$data['autoload'] = $autoloadClasses;
$data['autoloaderPaths'] = $autoloaderPaths;
+ $data['autoloaderNS'] = $autoloadNamespaces;
return $data;
}
}
}
+ if ( isset( $info['autoloaderNS'] ) ) {
+ AutoLoader::$psr4Namespaces += $info['autoloaderNS'];
+ }
+
foreach ( $info['defines'] as $name => $val ) {
define( $name, $val );
}
foreach ( $info['autoloaderPaths'] as $path ) {
- require_once $path;
+ if ( file_exists( $path ) ) {
+ require_once $path;
+ }
}
$this->loaded += $info['credits'];
}
/**
- * Register classes with the autoloader
+ * Fully expand autoloader paths
*
* @param string $dir
- * @param array $info
+ * @param array $files
* @return array
*/
- protected function processAutoLoader( $dir, array $info ) {
- if ( isset( $info['AutoloadClasses'] ) ) {
- // Make paths absolute, relative to the JSON file
- return array_map( function ( $file ) use ( $dir ) {
- return "$dir/$file";
- }, $info['AutoloadClasses'] );
- } else {
- return [];
+ protected function processAutoLoader( $dir, array $files ) {
+ // Make paths absolute, relative to the JSON file
+ foreach ( $files as &$file ) {
+ $file = "$dir/$file";
}
+ return $files;
}
}