Clang'ın kod tamamlama mekanizmasını kullanırken olası kod tamamlama hızlandırmalarını araştırıyorum. Aşağıda açıklanan akış , Anders Bakken tarafından yazılan rtag'lerde bulduğum şeydir .
Çeviri birimleri, değişiklikler için dosyaları izleyen bir arka plan programı tarafından ayrıştırılır. Bu, çağrılan clang_parseTranslationUnitve ilgili işlevler ( reparse*, dispose*) tarafından yapılır . Kullanıcı bir kaynak dosyadaki belirli bir satır ve sütunda bir tamamlama istediğinde, arka plan programı kaynak dosyanın son kaydedilen sürümü için önbelleğe alınmış çeviri birimini ve geçerli kaynak dosyasını clang_codeCompleteAt. ( Clang CodeComplete belgeleri ).
clang_parseTranslationUnit( CompletionThread :: process, satır 271'den ) iletilen bayraklar CXTranslationUnit_PrecompiledPreamble|CXTranslationUnit_CacheCompletionResults|CXTranslationUnit_SkipFunctionBodes. clang_codeCompleteAt( CompletionThread :: process, satır 305'ten ) 'e aktarılan bayraklar CXCodeComplete_IncludeMacros|CXCodeComplete_IncludeCodePatterns.
Çağrı clang_codeCompleteAtçok yavaştır - tamamlanma yerinin, belgelerinde belirtilen kullanım amacının bir alt kümesi olan meşru üye erişim kodu olduğu durumlarda bile tamamlanması yaklaşık 3-5 saniye sürer clang_codeCompleteAt. IDE kod tamamlama standartlarına göre bu çok yavaş görünüyor. Bunu hızlandırmanın bir yolu var mı?
CXTranslationUnit_SkipFunctionBodies, CXCodeComplete_IncludeMacros, CXCodeComplete_IncludeCodePatternsve ben ile çalışıyorum kodu tabanında önemli bir fark görmedik. Hepsi tamamlanma başına ortalama 4 saniyedir. Sanırım bu sadece TU'ların boyutu yüzünden. CXTranslationUnit_PrecompiledPreambleolmasını sağlar reparseTUçok hızlı. Ancak, hatta ile CXTranslationUnit_CacheCompletionResults, clang_codeCompleteAtacı benim bir kullanım örneği için yavaşlayabilir.