Change-Id: I0069df20fbc7ee46c7dc177e5bf352434b8abf32 (cherry picked from commit 12c9e516a2a42d399f5d51f6ba1b162ba68f4894)
74 lines
1.9 KiB
PHP
74 lines
1.9 KiB
PHP
<?php
|
|
|
|
use PhpParser\Node;
|
|
use PhpParser\Node\Expr;
|
|
use PhpParser\Node\Stmt;
|
|
use PhpParser\ParserFactory;
|
|
use PhpParser\PhpVersion;
|
|
|
|
/**
|
|
* @coversNothing
|
|
*/
|
|
class ScopeStructureTest extends MediaWikiIntegrationTestCase {
|
|
|
|
public static function provideAutoloadNoFileScope() {
|
|
global $wgAutoloadLocalClasses;
|
|
$files = array_unique( $wgAutoloadLocalClasses );
|
|
$args = [];
|
|
foreach ( $files as $file ) {
|
|
$args[$file] = [ $file ];
|
|
}
|
|
return $args;
|
|
}
|
|
|
|
/**
|
|
* Confirm that all files in $wgAutoloadLocalClasses have no file-scope code
|
|
* apart from specific exemptions.
|
|
*
|
|
* This is slow (~15s).
|
|
*
|
|
* @dataProvider provideAutoloadNoFileScope
|
|
*/
|
|
public function testAutoloadNoFileScope( $file ) {
|
|
// This value should match the PHP version specified in composer.json,
|
|
// PHPVersionCheck.php, and .phan/config.php
|
|
$version = PhpVersion::fromComponents( 8, 1 );
|
|
$parser = ( new ParserFactory )->createForVersion( $version );
|
|
$ast = $parser->parse( file_get_contents( $file ) );
|
|
foreach ( $ast as $node ) {
|
|
if ( $node instanceof Stmt\ClassLike
|
|
|| $node instanceof Stmt\Namespace_
|
|
|| $node instanceof Stmt\Use_
|
|
|| $node instanceof Stmt\Nop
|
|
|| $node instanceof Stmt\Declare_
|
|
|| $node instanceof Stmt\Function_
|
|
) {
|
|
continue;
|
|
}
|
|
if ( $node instanceof Stmt\Expression ) {
|
|
$expr = $node->expr;
|
|
if ( $expr instanceof Expr\FuncCall ) {
|
|
if ( $expr->name instanceof Node\Name ) {
|
|
if ( in_array( $expr->name->toString(), [
|
|
'class_alias',
|
|
'define'
|
|
] ) ) {
|
|
continue;
|
|
}
|
|
}
|
|
} elseif ( $expr instanceof Expr\Include_ ) {
|
|
if ( $expr->type === Expr\Include_::TYPE_REQUIRE_ONCE ) {
|
|
continue;
|
|
}
|
|
} elseif ( $expr instanceof Expr\Assign ) {
|
|
if ( $expr->var->name === 'maintClass' ) {
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
$line = $node->getLine();
|
|
$this->assertNull( $node, "Found file scope code in $file at line $line" );
|
|
}
|
|
$this->assertTrue( true );
|
|
}
|
|
}
|