特定の実装でどのアルゴリズムが使用されているかを正確に言うことはできませんが、知識に基づいて推測することはできます。トライは、この問題のために非常に有用なデータ構造である:IDEは、各ノードでいくつかの余分なメタデータを、プロジェクト内のシンボルの全てのメモリに大規模なトライを維持することができます。
キャラクターを入力すると、トライ内のパスを歩きます。特定のトライノードのすべての子孫は、可能な補完です。IDEは、現在のコンテキストで意味のあるものでそれらを除外する必要がありますが、タブ補完ポップアップウィンドウに表示できる数だけ計算する必要があります。
より高度なタブ補完には、より複雑なトライが必要です。たとえば、Visual Assist Xには、キャメルケース記号の大文字を入力するだけでよい機能があります。たとえば、SFNと入力するSomeFunctionName
と、タブ補完ウィンドウに記号が表示されます。
トライ(または他のデータ構造)を計算するには、プロジェクト内のすべてのシンボルのリストを取得するために、すべてのコードを解析する必要があります。Visual Studioは.ncb
、これをプロジェクトと一緒に保存されているファイルであるIntelliSenseデータベースに保存するため、プロジェクトを閉じて再度開くたびにすべてを再解析する必要はありません。大規模なプロジェクト(たとえば、フォームソース管理を同期したばかりのプロジェクト)を初めて開くと、VSはすべてを解析してデータベースを生成するのに時間がかかります。
増分変更をどのように処理するのかわかりません。あなたが言ったように、あなたがコードを書いているとき、それは90%の確率で無効な構文であり、アイドル状態になるたびにすべてを再解析することは、特にによって含まれるヘッダーファイルを変更している場合、CPUに大きな負担をかけます。多数のソースファイル。
(a)プロジェクトを実際にビルドするとき(またはプロジェクトを閉じたり開いたりしたとき)にのみ再解析するか、(b)ある種のローカル解析を実行して、現在の場所のコードのみを解析するのではないかと思います。関連するシンボルの名前を取得するために、いくつかの限定された方法で編集されました。C ++は非常に複雑な文法を持っているため、重いテンプレートメタプログラミングなどを使用している場合、暗い場所で奇妙に動作する可能性があります。