psalm開発を複雑にしているもの¶
これは、他の人の助けになるかもしれない、やや非公式なリストである。
型推論¶
型推論はPsalmの大きな特徴のひとつです。これは、PHPのさまざまな要素(関数呼び出し、if/for/foreach文など)が、コード内のデータに対してどのような意味を持つのかを理解しようとします。
型推論の中には、厄介な領域がいくつもあります:
ループ¶
breakとcontinueは厄介です。この分析は主にLoopAnalyzer
型の組み合わせ¶
Psalmが多くの型をサポートしているため、型を組み合わせる際には多くのエッジケースがある。型の結合はTypeCombiner
で行われます。
論理アサーション¶
PHPの異なる要素は、if条件式やternaryなどのユーザーアサーション ロジックにどのような影響を与えるのでしょうか。このロジックは、多くの異なるクラスにまたがっています。
ジェネリックとテンプレート化されたコード¶
テンプレート化されたコードがどのように動作するのか(@template
タグ)、他の言語(HackやTypeScriptなど)でどの程度動作するのかを理解するのは難しいです。Psalmはネストされたテンプレート (@template T1 of T2
) などもサポートしているので、さらに厄介だ。
デッドコードの検出¶
未使用の変数を検出するには、いくつかの楽しいdata-flow analysis が必要です。
異なる実行間で未使用のクラスやメソッドを検出するには、それらのクラスへの参照をキャッシュに保持する必要があります(下記参照)。
コミュニティのサポート - 正式な PHPDoc アノテーションのサポート - 非公式な PHPDoc アノテーションのサポート 例:ArrayIterator|string[]
、文字列に対するArrayIterator
を表す - 非 Composer プロジェクト 例: WordPress¶
Psalmの高速化¶
パーサーベースのリフレクション¶
分析に必要なすべてをスキャンする必要がある
フォークプロセス** (Windows以外)¶
ほとんどがPhanから借りたコードで処理されるが、微妙な問題を引き起こす可能性がある。
キャッシング¶
下記参照
キャッシュの無効化¶
解析結果の無効化¶
どのメソッド/プロパティが他のどのファイルで使用されているかを追跡し、リンクされたメソッドが変更された場合にそれらの結果を無効にする必要があります。
部分的な解析¶
変更されたファイルの断片を解析し直す。
言語サーバーサポート¶
一時的なファイル変更の処理¶
ファイルが変更された場合、Psalmは不必要な再解析を避けるため、ファイル内で何が変更されたかを把握します。
不正な PHP コードの処理¶
人がコードを書くとき、書いたとおりになるとは限りません。言語サーバは、そのような不正なコードに対処する必要があります。
Psalterでコードを修正する¶
コードの追加/置換¶
何が変更されたかを把握し、人間が行えたかもしれない編集を行う
最小限の差分¶
必要以上の変更は難しい