Need help with idea-php-generics-plugin?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

Haehnchen
147 Stars 8 Forks MIT License 85 Commits 0 Opened issues

Description

Support generics types in PhpStorm via psalm / phpstan docblock

Services available

!
?

Need anything else?

Contributors list

# 6,775
JavaScr...
intelli...
phpstor...
php7
51 commits
# 14,900
Symfony
php7
phpstor...
GraphQL
4 commits
# 52,018
PHP
intelli...
phpstor...
php7
2 commits
# 368,907
Symfony
intelli...
phpstor...
HTML
2 commits
# 22,270
PHP
Symfony
Electro...
php7
1 commit
# 646,076
PHP
intelli...
phpstor...
HTML
1 commit

IntelliJ IDEA / PhpStorm PHPStan / Psalm / Generics

Use Replacements:

  • https://github.com/JetBrains/phpstorm-psalm-plugin
  • https://github.com/JetBrains/phpstorm-phpstan-plugin

Build Status Version Downloads Downloads last month Donate to this project using Paypal

Key

Value
Plugin url https://plugins.jetbrains.com/plugin/12754-php-generics
Id de.espend.idea.php.generics
Changelog CHANGELOG

!!! Work in progress !!!

Supported

types

/**
 * @[psalm-|phpstan-]template T
 * @[psalm-|phpstan-]param class-string $class
 * @[psalm-|phpstan-]return T
 */
function instantiator(string $class) {
    return new $class();
}

class Foo {}

$a = instantiator(Foo::class); // Psalm knows the result is an object of type Foo

class-string

  • Inspections for not given wrong parameter
    /**
     * @[psalm-|phpstan-]template T as Exception
     * @[psalm-|phpstan-]param T::class $type
     * @return T
     */
    function a(string $type): Exception
    {
        return new $type;
    }

templates

    $collection = new FooCollection();

// its now a type of "Foobar"
$foobar = $collection->getValue();
$foobar-&gt;get<caret>Foobar(); // method is clickable and autocompletes

    /**
     * @[psalm-|phpstan-]template T
     */
    class Collection
    {
        /**
         * @[psalm-|phpstan-]return T
         */
        public function getValue() {}
    }

/**
 * @[psalm-|phpstan-]extends Collection<foobar>
 */
class FooCollection extends Collection {}

class Foobar
{
    public function getFoobar() {}
}

Object-like arrays

https://psalm.dev/docs/annotatingcode/typesyntax/array_types/

    a(['' => ''])

    /**
     * @[psalm-|phpstan-]param array{foo: string, bar: int} $type
     */
    function a(array $type): Exception
    {
    }

psalm-immutable and psalm-readonly

Inspection to show disallowed write access

class PsalmReadOnly {
    /**
     * @psalm-readonly
     */
    public string $readOnly;
}

/**

  • @psalm-immutable
  • / class PsalmImmutable { public string $readOnly; }

Follows into errors hints

(new PsalmReadOnly())->readOnly = 'test';
(new PsalmImmutable())->readOnly = 'test';

Quality Tools

Provides support for quality tools inspection via directly call PHPStan or Psalm reporting via

codestyle
format

Limitation / Issues

  • Inconsistently PhpStorm docblock parser: https://youtrack.jetbrains.com/issue/WI-47644

## Screenshots

class-string Object-like arrays Psalm Immutable Quality Tool Template Types

TODO

https://youtrack.jetbrains.com/issue/WI-47158

/**
 * @template T
 */
class Map
{
    /**
     * @param array
     */
    public function __construct(array $data = []) {}
    /**
     * @return T
     */
    public function get(string $key) {}
    /**
     * @param T $value
     */
    public function set(string $key, $value): void {}
}
// Automatically inferred as Map
$map = new Map([0 => 'Foo', 1 => 'Bar']);
$map->set(2, true); // Expected string

https://youtrack.jetbrains.com/issue/WI-45248

    class Assert
    {
        /**
         * @psalm-template ExpectedType of object
         * @psalm-param class-string $class
         * @psalm-assert ExpectedType $value
         */
        public static function isInstanceOf($value, $class, $message = '')
        {
        }
    }

https://github.com/phpstan/phpdoc-parser/pull/30

/**
* @param array{'foo': int, "bar": string} $a
* @param array{0: int, 1?: int} $a
* @param array{int, int} $a
* @param array{foo: int, bar: string} $a
* @param array{foo:string, bar:?int} $a
*/

Others

 /** @var array */

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.