1
0
mirror of https://github.com/danog/psalm.git synced 2024-11-27 12:55:26 +01:00
psalm/docs
Barney Laurance 94f934627c Work in progress - resolve directories from config file location (#1904)
* Add resolveFromConfigFile config option

Treats all paths as relative to the location of the config file, not
the current working directory of the process.

This commit just changes psalm, further commits will be needed to
apply the change to psalter and the LSP server.

* Copy asset xml files into project root for testing, delete during teardown

Needed since paths are now resolved relative to the position of the
file.

Not sure why I only saw a test failre for 1.xml - would have expected it
for all eight files.

* Fix following rebase

* Move psalm --init handly code above working directory setting code

If there's no psalm.xml yet we can't use the location of psalm.xml to
set our working directory

* Move Psalm version output code above working directory resolution

Working directory doesn't need to be known to output version constant

* Rely on new config file based working directory in end to end test

* Dont use rely on config dir for --alter - not currently working

* Fix code style error

* Add failing test for supporting config without `resolveFromConfigFile="true"`

* Don't treat config directory as a path to check

* Document resolveFromConfigFile setting
2019-07-06 12:21:39 -04:00
..
annotating_code Fix typos with codespell (#1870) 2019-06-28 13:59:09 -04:00
manipulating_code fix typo (#1819) 2019-06-20 09:05:22 -04:00
running_psalm Work in progress - resolve directories from config file location (#1904) 2019-07-06 12:21:39 -04:00
how_psalm_works.md
README.md Break out docblock_type_syntax.md into separate files 2019-06-27 17:00:26 -04:00
what_makes_psalm_complicated.md stripping trailing whitespace 2019-02-11 18:39:19 -05:00

About Psalm

Psalm is a static analysis tool that attempts to dig into your program and find as many type-related bugs as possible.

It has a few features that go further than other similar tools:

  • Mixed type warnings
    If Psalm cannot infer a type for an expression then it uses a mixed placeholder. Any mixed type is a sign of an insufficiently-documented codebase. You can configure Psalm warn when encountering mixed types by adding totallyTyped="true" attribute to your XML config file.

  • Logic checks
    Psalm keeps track of logical assertions made about your code, so if ($a && $a) {} and if ($a && !$a) {} are both treated as issues. Psalm also keeps track of logical assertions made in prior code paths, preventing issues like if ($a) {} elseif ($a) {}.

  • Property initialisation checks
    Psalm checks that all properties of a given object have values after the constructor is called.

  • Support for complicated array shapes
    Psalm has support for object-like arrays, allowing you to specify types for all keys of an array if you so wish.

Psalm also has a few features to make it perform as well as possible on large codebases:

  • Multi-threaded mode
    Using the --threads=[X] command line option will run Psalm's analysis stage on [X] threads. Useful for large codebases, it has a massive impact on performance.

  • Incremental checks
    When using the --diff command line option, Psalm will only analyse files that have changed and files that reference them.

Example output

// somefile.php
<?php
$a = ['foo', 'bar'];
echo implode($a, ' ');
> ./vendor/bin/psalm somefile.php
ERROR: InvalidArgument - somefile.php:3:14 - Argument 1 of implode expects `string`, `array` provided

Inspirations

There are two main inspirations for Psalm:

  • Etsy's Phan, which uses nikic's php-ast extension to create an abstract syntax tree
  • Facebook's Hack, a PHP-like language that supports many advanced typing features natively, so docblocks aren't necessary.

Index