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
は非常に遅くなります。