mirror of
https://github.com/danog/psalm.git
synced 2024-12-11 08:49:52 +01:00
62a0ece035
ProjectAnalyzer consumed Config::$fileExtensions early in its constructor - without having processed plugins' modifications, registering their custom scanners or analyzer implementations. This change * adds new specific interface \Psalm\Plugin\FileExtensionsInterface to be used by plugin implementations * extracts file extension handling from \Psalm\PluginRegistrationSocket and interface \Psalm\Plugin\RegistrationInterface to a new dedicated \Psalm\PluginFileExtensionsSocket and new interface \Psalm\Plugin\FileExtensionsInterface !!! this is a breaking change in PluginRegistrationSocket !!! * adds runtime in-memory cache for Config::$plugins * calls new method Config::processPluginFileExtensions(), providing modifications to file extension only early in ProjectAnalyzer * adjusts documentation
44 lines
1.6 KiB
Markdown
44 lines
1.6 KiB
Markdown
# Checking non-PHP files
|
|
|
|
Psalm supports the ability to check various PHPish files by extending the `FileChecker` class. For example, if you have a template where the variables are set elsewhere, Psalm can scrape those variables and check the template with those variables pre-populated.
|
|
|
|
An example TemplateChecker is provided [here](https://github.com/vimeo/psalm/blob/master/examples/TemplateChecker.php).
|
|
|
|
## Using `psalm.xml`
|
|
|
|
To ensure your custom `FileChecker` is used, you must update the Psalm `fileExtensions` config in psalm.xml:
|
|
```xml
|
|
<fileExtensions>
|
|
<extension name=".php" />
|
|
<extension name=".phpt" checker="path/to/TemplateChecker.php" />
|
|
</fileExtensions>
|
|
```
|
|
|
|
## Using custom plugin
|
|
|
|
Plugins can register their own custom scanner and analyzer implementations for particular file extensions.
|
|
|
|
```php
|
|
<?php
|
|
namespace Psalm\Example;
|
|
|
|
use Psalm\Plugin\PluginEntryPointInterface;
|
|
use Psalm\Plugin\PluginFileExtensionsInterface;
|
|
use Psalm\Plugin\FileExtensionsInterface;
|
|
use Psalm\Plugin\RegistrationInterface;
|
|
|
|
class CustomPlugin implements PluginEntryPointInterface, PluginFileExtensionsInterface
|
|
{
|
|
public function __invoke(RegistrationInterface $registration, ?\SimpleXMLElement $config = null): void
|
|
{
|
|
// ... regular plugin processes, stub registration, hook registration
|
|
}
|
|
|
|
public function processFileExtensions(FileExtensionsInterface $fileExtensions, ?SimpleXMLElement $config = null): void
|
|
{
|
|
$fileExtensions->addFileTypeScanner('phpt', TemplateScanner::class);
|
|
$fileExtensions->addFileTypeAnalyzer('phpt', TemplateAnalyzer::class);
|
|
}
|
|
}
|
|
```
|