clangのコード補完メカニズムを使用しながら、コード補完の潜在的なスピードアップを調査しています。以下に説明するフローは、rtagsで見つけたものです、Anders Bakkenによるでです。
翻訳単位は、変更を監視するデーモンによって解析されます。これは、呼び出されたclang_parseTranslationUnit関数と関連する関数(reparse*、dispose*)によって行われます。ユーザーがソースファイルの特定の行と列で完了を要求すると、デーモンは、最後に保存されたバージョンのソースファイルと現在のソースファイルのキャッシュされた変換単位をに渡しますclang_codeCompleteAt。(Clang CodeComplete docs)。
clang_parseTranslationUnit(CompletionThread :: process、行271から)に渡されるフラグはCXTranslationUnit_PrecompiledPreamble|CXTranslationUnit_CacheCompletionResults|CXTranslationUnit_SkipFunctionBodesです。clang_codeCompleteAt(CompletionThread :: process、行305から)に渡されるフラグはCXCodeComplete_IncludeMacros|CXCodeComplete_IncludeCodePatternsです。
への呼び出しclang_codeCompleteAtは非常に遅くなります。完了場所が正当なメンバーアクセスコードである場合でも、完了を取得するのに約3〜5秒かかりますclang_codeCompleteAt。これは、のドキュメントで言及されている使用目的のサブセットです。これはIDEのコード補完標準では遅すぎるようです。これをスピードアップする方法はありますか?
CXTranslationUnit_SkipFunctionBodies、CXCodeComplete_IncludeMacros、CXCodeComplete_IncludeCodePatternsそして私が働いているコードベースに有意差は見ませんでした。それらすべての平均は、完了ごとに約4秒です。これは単にTUのサイズのためだと思います。CXTranslationUnit_PrecompiledPreamble確実reparseTUに非常に高速です。ただし、を使用しても、私のユースケースCXTranslationUnit_CacheCompletionResultsでclang_codeCompleteAtは非常に遅くなります。