2017-01-27 16 views
1

私はしばらく疑問に思っていました。オートコンプリートはどのように機能しますか?インテリセンスとオートコンプリートはどのように機能しますか?

例:PhpStormで 私はそれは私にそのクラスのすべてのプロパティとメソッドを示していたクラスと型->を使用するとき。また、自動的に名前空間を完成させ、jQueryなどのライブラリ内の関数も自動完成します。

ファイルで何らかの正規表現を実行するのですか、それとも何らかの理由で解析しますか?

+0

ありがとうございました! =) – g3mini

+0

こんにちはg3mini、あなたの問題は解決しましたか? artspdの回答があなたの質問に役立つと思うなら、それを回答としてマークすることができます。同じまたは類似の問題を持つ他のコミュニティメンバーがこの情報を簡単に検索して確認できます:) –

+0

あなたは...私は唯一ちょうど完全にそれを読む時間を得た=) – g3mini

答えて

4

PhpStormの開発元はこちら。私は、自分のプラグインを実装したい人に役立つかもしれない場合に備えて、いくつかの基本を調べたいと思います。

まず、lexerを使用してコードをトークンに分割する必要があります。 parserを使用して、AST(抽象構文ツリー)とPSI(プログラム構造インターフェース)が構築されます。 PhpStormには、レクサーとパーサの独自の実装があります。これは、PSIツリーが単純なクラスのように見える方法です。

PSI tree

エディタで入力するか、明示的に終了アクション(はCtrl +スペースcompletion contributorsの数が呼び出されるを呼び出します。カーソルの位置に基づいて提案のリストを返すことを意図しています。

フィールド参照内で補完が呼び出された場合を考えてみましょう。

Field reference

PhpStormは、現在の位置で、すべてのクラスのメンバーが提案することができることを知っています。クラス参照(この場合は$class変数)の取得とその型の決定を開始します。変数にresolvesという変数がある場合、その型はクラスのFQN(完全修飾名)です。

クラスのメソッドとフィールドを取得するには、そのPSI要素が必要です。特殊インデックスは、FQNを適切なPhpClassツリー要素にマッピングするために使用されます。インデックスは、最初にプロジェクトを開いたときに作成され、変更されたファイルごとに更新されます。

PhpStormは、PSI要素(親のものを含む)からすべてのメンバーを収集し、その特性から収集します。現在のコンテキスト(アクセススコープなど)と既に入力されている名前の部分(f)に基づいてフィルタリングされます。

Code completion

提案は、要素の名前はようにその種類、位置と、一致してどのように良い順にソートされたリストに示されています。入力時にリストが並び替わります。

を押すと、要素を挿入するためにを入力します。PhpStormはもう1つのハンドラを呼び出します。コードに要素を正しく挿入する方法を知っています。たとえば、メソッドのカッコを追加したり、クラス参照をインポートしたりすることができます。私たちの場合は、メソッドにパラメータがないため、かっこを入れてその直後にカーソルを置くだけで十分です。基本的にはこれだけです

Result

。IntelliJ IDEAプラットフォームは、プラグインが上記の各ステップの実装を提供できるようにすることに言及する価値があります。したがって、補完は、いくつかの特定のフレームワークまたは言語のために改善または拡張することができます。

+0

この非常に詳細な非常に有用な説明をありがとう! :D – g3mini

関連する問題