Continuous integration/Tutorials/Add phan to a MediaWiki extension

Jump to navigation Jump to search

This is a tutorial to set up phan for a MediaWiki extension. We'll look at the ParserMigration extension specifically.


You'll need to install PHP 7.0, and the ast extension. On Debian/Ubuntu sudo apt-get install php-cli php-ast should do it. phan has some other advice for this part too.

We'll clone phan to a directory, and set it up.

$ cd ~/projects # Pick any directory you want
$ git clone
$ cd phan
$ git checkout 0.9.0
$ composer install --no-dev
$ export PHAN=/home/km/projects/phan/phan # Wherever you installed phan to

Adding phan configuration[edit]

I'm going to assume that you installed MediaWiki core to ~/projects/mediawiki and ParserMigration to ~/projects/mediawiki/extensions/ParserMigration. Make sure you've fully set up MediaWiki core and installed all the composer dependencies.

First, let's set up the default configuration:

$ cd ~/projects/mediawiki/extensions/ParserMigration
$ mkdir -p tests/phan
$ cd tests/phan

Now copy phab:P6244 into tests/phan/config.php (example). You should also add /tests/phan/issues to the .gitignore (example). We're now ready to try to run phan!

$ cd ~/projects/mediawiki/extensions/ParserMigration
$ PHAN=/home/km/projects/phan/phan ../../tests/phan/bin/phan . -p

You should see a progress bar, and it might take a minute to finish running. It looks like we have some errors:

includes/Hooks.php:11 PhanUndeclaredTypeParameter Parameter of undeclared type \MediaWiki\ParserMigration\User
includes/MigrationEditPage.php:31 PhanDeprecatedProperty Reference to deprecated property \MediaWiki\ParserMigration\MigrationEditPage::mTitle defined at ./../../includes/EditPage.php:230
includes/MigrationEditPage.php:34 PhanDeprecatedProperty Reference to deprecated property \MediaWiki\ParserMigration\MigrationEditPage::mTitle defined at ./../../includes/EditPage.php:230

Looking at the first one, the namespace for User on the Hooks::onGetPreferences() documentation comment is wrong. Let's fix it (example).

For the second one, EditPage::$mTitle is marked as deprecated for public use, to it's OK that we're using it in MigrationEditPage. Let's suppress that warning for now by adding it to suppress_issue_types in config.php (example). You should make sure to add a comment about why it is being disabled.

For whatever extension you're working on, there will likely be other errors. You'll have to use some judgement on whether the issue needs fixing or can be suppressed.

Let's run phan again with the same command, and there should be no errors left! You can commit your work and submit it to Gerrit.

On your Gerrit patch, comment check experimental and it'll run phan as part of the CI system to make sure it will pass when enabled for all patches.

You can then send a patch to the integration/config repository to run phan for the repository on a per-commit basis. See [1] for an example.


If your extension depends upon other extensions, you can add those extensions to directory_list and exclude_analysis_directory_list. See TwoColConflict as an example.