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_parseTranslationUnit
ve 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_IncludeCodePatterns
ve 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_PrecompiledPreamble
olmasını sağlar reparseTU
çok hızlı. Ancak, hatta ile CXTranslationUnit_CacheCompletionResults
, clang_codeCompleteAt
acı benim bir kullanım örneği için yavaşlayabilir.