Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/wata727/phan-query-plugin
A Phan plugin to add a new rule without writing plugins
https://github.com/wata727/phan-query-plugin
lint linter phan php plugin static-analysis
Last synced: 20 days ago
JSON representation
A Phan plugin to add a new rule without writing plugins
- Host: GitHub
- URL: https://github.com/wata727/phan-query-plugin
- Owner: wata727
- License: mit
- Created: 2018-05-01T16:58:45.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2018-05-05T13:12:28.000Z (over 6 years ago)
- Last Synced: 2024-12-11T18:54:05.580Z (22 days ago)
- Topics: lint, linter, phan, php, plugin, static-analysis
- Language: PHP
- Homepage:
- Size: 32.2 KB
- Stars: 2
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Phan Query Plugin
[![Build Status](https://travis-ci.org/wata727/phan-query-plugin.svg?branch=master)](https://travis-ci.org/wata727/phan-query-plugin)
[![Latest Stable Version](https://poser.pugx.org/wata727/phan-query-plugin/v/stable)](https://packagist.org/packages/wata727/phan-query-plugin)
[![MIT License](http://img.shields.io/badge/license-MIT-blue.svg?style=flat)](LICENSE)A Phan plugin to add a new rule without writing plugins. This plugin inspired by [Querly](https://github.com/soutaro/querly).
## Installation
You can install this plugin with composer.
```
$ composer require --dev wata727/phan-query-plugin
```After that, Set this plugin path to `.phan/config.php`.
```php
[__DIR__."/../vendor/wata727/phan-query-plugin/plugins/QueryPlugin.php"]
];
```## Quick Start
At first, creates files as follows:
`.phan/config.php`:
```php
[__DIR__."/../vendor/wata727/phan-query-plugin/plugins/QueryPlugin.php"]
];
````.phan/query.php`:
```php
"PhanQueryCatFound",
"message" => "Cat Found",
"pattern" => '$cat->meow();',
]
];
````test.php`:
```php
meow();
```Try following command:
```
$ vendor/bin/phan test.php
```You can get the result:
```
test.php:12 PhanQueryCatFound Cat Found
```### What happened?
This plugin loads `.phan/query.php` and searches for your code that matches the defined `pattern` of Query.
In the above example, since the code matching `$cat->meow();` existed in line 12, it was emitted as Phan's issue.The emitted issue has type and message as well as Phan's original issue. These are `type` and `message` defined in your Query.
### What is the difference with regular expressions?
This plugin uses AST for matching node. For example, `$cat->meow($arg1, $arg2);` matches all of the following:
- `$cat->meow($arg1, $arg2);`
- `$cat->meow($arg1 , $arg2);`
- `$cat->meow($arg1,$arg2);`## Query Syntax
What kind of syntax can be written in `pattern`? This is PHP-like pattern matching syntax, which satisfying the following:
- The pattern expressions must be valid as PHP
- For example, a trailing semicolon is required.
- But the `` syntax is available in the pattern.### `` Syntax
You can use `` syntax in a pattern of Query. If you use it, the following pattern matches `test.php` like the above.
```
"PhanQueryAllCatFound",
"message" => "Cat Found",
"pattern" => '->meow();',
]
];
```This means that the Query checks types of variables when use this pattern. Also, if you specify ``, it matches all variables.
## Testing your Query
You can write a test to make sure the Query works correctly. For example:
```php
"PhanQueryCatFound",
"message" => "Cat Found",
"pattern" => '$cat->meow();',
"test" => [
"match" => <<<'EOD'
meow();
EOD
,
"unmatch" => <<<'EOD'
meow();
EOD
],
],
];
```The `match` value is the code that matches `pattern`, and the `unmatch` value is the code that not match `pattern`. You can run the tests with the following command:
```
$ vendor/bin/phan_query_test
All 2 tests are passed!
```## Author
[Kazuma Watanabe](https://github.com/wata727)