94f934627c
* 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 |
||
---|---|---|
.. | ||
annotating_code | ||
manipulating_code | ||
running_psalm | ||
how_psalm_works.md | ||
README.md | ||
what_makes_psalm_complicated.md |
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 amixed
placeholder. Anymixed
type is a sign of an insufficiently-documented codebase. You can configure Psalm warn when encounteringmixed
types by addingtotallyTyped="true"
attribute to your XML config file. -
Logic checks
Psalm keeps track of logical assertions made about your code, soif ($a && $a) {}
andif ($a && !$a) {}
are both treated as issues. Psalm also keeps track of logical assertions made in prior code paths, preventing issues likeif ($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
- Running Psalm:
- Annotating code:
- Manipulating code: