多くの言語と同じようにD言語にもコード補完ツールがあり、DCDという。
コード補完ツールは基本の仕組みはほぼほぼ同じなのだが、それなりに個性があったりする。
例えばコンパイラがライブラリとしてパーサを提供していてそれを使っているもの(RustのracerやGoのgocode、Nimのnimsuggest)、別にあるパーサライブラリを使っているもの(Pythonのjediが使っているparso)といった違いがある。DCDは後者に属しており、dsymbol/dparseというライブラリを使っている。このあたりのライブラリをまとめて作っているのがhackerPilot氏である。
DCDの特徴として
- クライアント-サーバモデル、クライアントがコマンドを投げてサーバが結果を返す仕組み
- 通信はUNIXドメインソケット通信(posix)かTCPソケット通信(Windows)
- 通信のメッセージはMessagePackにより圧縮されている
- 補完以外にもddocの情報をとってこれるようになっている
- 補完候補を探す対象モジュールをパスを追加することで増やすことができる(減らすことは現状できないようだ)
- サーバ側ではidentifierやモジュール名をキャッシュする仕組みがある
などが挙げられる。
あとDCDは機能的には結構シンプルで、racerやnimsuggestのようなgoto-definitionの機能はない。tagsでいいじゃんということだろうか。
※追記
company-dcdはgoto-definitionの機能を持っていて、どうやってるのだろうと思ったが dcd-clinet --symbolLocationでうまいこととれるようだ。getSymbolsByTokenChainあたりを読めばわかりそうだがめんどくさくなったので打ち止め。