Estou investigando possíveis acelerações de conclusão de código ao usar o mecanismo de conclusão de código do clang. O fluxo descrito abaixo é o que encontrei no rtags , de Anders Bakken.
As unidades de tradução são analisadas por um daemon que monitora arquivos para alterações. Isso é feito por clang_parseTranslationUnit
funções chamadas e relacionadas ( reparse*
, dispose*
). Quando o usuário solicita o preenchimento de uma determinada linha e coluna em um arquivo de origem, o daemon passa a unidade de tradução em cache da última versão salva do arquivo de origem e do arquivo de origem atual para clang_codeCompleteAt
. ( Documentos do Clang CodeComplete ).
Os sinalizadores passados para clang_parseTranslationUnit
(de CompletionThread :: process, linha 271 ) são CXTranslationUnit_PrecompiledPreamble|CXTranslationUnit_CacheCompletionResults|CXTranslationUnit_SkipFunctionBodes
. Os sinalizadores passados para clang_codeCompleteAt
(de CompletionThread :: process, linha 305 ) são CXCodeComplete_IncludeMacros|CXCodeComplete_IncludeCodePatterns
.
A chamada para clang_codeCompleteAt
é muito lenta - leva cerca de 3-5 segundos para obter uma conclusão, mesmo nos casos em que o local de conclusão é um código de acesso de membro legítimo, um subconjunto do caso de uso pretendido mencionado na documentação de clang_codeCompleteAt
. Isso parece muito lento para os padrões de conclusão de código IDE. Existe uma maneira de acelerar isso?
CXTranslationUnit_SkipFunctionBodies
, CXCodeComplete_IncludeMacros
, CXCodeComplete_IncludeCodePatterns
e não viu uma diferença significativa na base de código que eu estou trabalhando. Todos eles em média cerca de 4 segundos por completo. Acho que isso se deve ao tamanho das TUs. CXTranslationUnit_PrecompiledPreamble
garante reparseTU
é muito rápido. No entanto, mesmo com CXTranslationUnit_CacheCompletionResults
, clang_codeCompleteAt
é dolorosamente lento para meu caso de uso.