mirror of
https://github.com/danog/psalm-plugin-symfony.git
synced 2024-11-26 11:55:00 +01:00
initial commit
This commit is contained in:
commit
378289cbe1
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
vendor
|
||||||
|
composer.lock
|
25
.travis.yml
Normal file
25
.travis.yml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
language: php
|
||||||
|
|
||||||
|
php:
|
||||||
|
- 7.1
|
||||||
|
- 7.2
|
||||||
|
- 7.3
|
||||||
|
|
||||||
|
before_install:
|
||||||
|
- phpenv config-rm xdebug.ini || true
|
||||||
|
|
||||||
|
install:
|
||||||
|
- composer install
|
||||||
|
- if [[ "$DEPS" = 'high' ]]; then travis_retry composer $DEFAULT_COMPOSER_FLAGS update; fi
|
||||||
|
- if [[ "$DEPS" = 'low' ]]; then travis_retry composer $DEFAULT_COMPOSER_FLAGS --prefer-lowest --prefer-stable update; fi
|
||||||
|
- if [[ "$DEPS" = 'stable' ]]; then travis_retry composer $DEFAULT_COMPOSER_FLAGS --prefer-stable update; fi
|
||||||
|
|
||||||
|
script: composer check
|
||||||
|
|
||||||
|
env:
|
||||||
|
matrix:
|
||||||
|
- DEPS="low"
|
||||||
|
- DEPS="high"
|
||||||
|
- DEPS="stable"
|
||||||
|
global:
|
||||||
|
- DEFAULT_COMPOSER_FLAGS="--no-interaction --no-suggest"
|
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2019 Farhad Safarov
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
8
README.md
Normal file
8
README.md
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
# Symfony Psalm Plugin
|
||||||
|
|
||||||
|
### Installation
|
||||||
|
|
||||||
|
```
|
||||||
|
composer require --dev seferov/symfony-psalm-plugin
|
||||||
|
vendor/bin/psalm-plugin enable seferov/symfony-psalm-plugin
|
||||||
|
```
|
33
composer.json
Normal file
33
composer.json
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"name": "seferov/symfony-psalm-plugin",
|
||||||
|
"description": "Psalm Plugin for Symfony",
|
||||||
|
"type": "psalm-plugin",
|
||||||
|
"require": {
|
||||||
|
"php": "^7.1",
|
||||||
|
"vimeo/psalm": "^3.2",
|
||||||
|
"symfony/framework-bundle": "^3.0 || ^4.0"
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Farhad Safarov",
|
||||||
|
"email": "farhad.safarov@gmail.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Seferov\\SymfonyPsalmPlugin\\": "src"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"extra": {
|
||||||
|
"psalm" : {
|
||||||
|
"pluginClass": "Seferov\\SymfonyPsalmPlugin\\Plugin"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"check": [
|
||||||
|
"@analyze"
|
||||||
|
],
|
||||||
|
"analyze": "psalm"
|
||||||
|
}
|
||||||
|
}
|
15
psalm.xml
Normal file
15
psalm.xml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<psalm
|
||||||
|
totallyTyped="false"
|
||||||
|
resolveFromConfigFile="true"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xmlns="https://getpsalm.org/schema/config"
|
||||||
|
xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
|
||||||
|
>
|
||||||
|
<projectFiles>
|
||||||
|
<directory name="src" />
|
||||||
|
<ignoreFiles>
|
||||||
|
<directory name="vendor" />
|
||||||
|
</ignoreFiles>
|
||||||
|
</projectFiles>
|
||||||
|
</psalm>
|
42
src/Handler/ClassHandler.php
Normal file
42
src/Handler/ClassHandler.php
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Seferov\SymfonyPsalmPlugin\Handler;
|
||||||
|
|
||||||
|
use PhpParser\Node;
|
||||||
|
use Psalm\Codebase;
|
||||||
|
use Psalm\CodeLocation;
|
||||||
|
use Psalm\FileManipulation;
|
||||||
|
use Psalm\IssueBuffer;
|
||||||
|
use Psalm\Plugin\Hook\AfterClassLikeAnalysisInterface;
|
||||||
|
use Psalm\StatementsSource;
|
||||||
|
use Psalm\Storage\ClassLikeStorage;
|
||||||
|
use Seferov\SymfonyPsalmPlugin\Issue\ContainerDependency;
|
||||||
|
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||||
|
|
||||||
|
class ClassHandler implements AfterClassLikeAnalysisInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Called after a statement has been checked
|
||||||
|
*
|
||||||
|
* @param FileManipulation[] $file_replacements
|
||||||
|
*
|
||||||
|
* @return null|false
|
||||||
|
*/
|
||||||
|
public static function afterStatementAnalysis(Node\Stmt\ClassLike $stmt, ClassLikeStorage $classlike_storage, StatementsSource $statements_source, Codebase $codebase, array &$file_replacements = [])
|
||||||
|
{
|
||||||
|
foreach ($stmt->stmts as $stmt) {
|
||||||
|
if ($stmt instanceof Node\Stmt\ClassMethod && '__construct' === $stmt->name->name) {
|
||||||
|
foreach ($stmt->params as $param) {
|
||||||
|
if ($param->type instanceof Node\Name && ContainerInterface::class === $param->type->getAttributes()['resolvedName']) {
|
||||||
|
IssueBuffer::accepts(
|
||||||
|
new ContainerDependency(new CodeLocation($statements_source, $stmt)),
|
||||||
|
$statements_source->getSuppressedIssues()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
14
src/Issue/ContainerDependency.php
Normal file
14
src/Issue/ContainerDependency.php
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Seferov\SymfonyPsalmPlugin\Issue;
|
||||||
|
|
||||||
|
use Psalm\CodeLocation;
|
||||||
|
use Psalm\Issue\CodeIssue;
|
||||||
|
|
||||||
|
class ContainerDependency extends CodeIssue
|
||||||
|
{
|
||||||
|
public function __construct(CodeLocation $code_location)
|
||||||
|
{
|
||||||
|
parent::__construct('Container must not inject into services as dependency!', $code_location);
|
||||||
|
}
|
||||||
|
}
|
19
src/Plugin.php
Normal file
19
src/Plugin.php
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Seferov\SymfonyPsalmPlugin;
|
||||||
|
|
||||||
|
use Psalm\Plugin\PluginEntryPointInterface;
|
||||||
|
use Psalm\Plugin\RegistrationInterface;
|
||||||
|
use Seferov\SymfonyPsalmPlugin\Handler\ClassHandler;
|
||||||
|
use SimpleXMLElement;
|
||||||
|
|
||||||
|
class Plugin implements PluginEntryPointInterface
|
||||||
|
{
|
||||||
|
/** @return void */
|
||||||
|
public function __invoke(RegistrationInterface $api, SimpleXMLElement $config = null)
|
||||||
|
{
|
||||||
|
require_once __DIR__ . '/Handler/ClassHandler.php';
|
||||||
|
|
||||||
|
$api->registerHooksFromClass(ClassHandler::class);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user