Estoy investigando posibles aceleraciones de finalización de código mientras uso el mecanismo de finalización de código de clang. El flujo que se describe a continuación es lo que encontré en rtags , de Anders Bakken.
Las unidades de traducción se analizan mediante un demonio que supervisa los archivos en busca de cambios. Esto se realiza mediante clang_parseTranslationUnit
funciones llamadas y relacionadas ( reparse*
, dispose*
). Cuando el usuario solicita que se complete una línea y columna determinadas en un archivo de origen, el demonio pasa la unidad de traducción en caché para la última versión guardada del archivo de origen y el archivo de origen actual a clang_codeCompleteAt
. ( Documentos Clang CodeComplete ).
Las banderas pasadas a clang_parseTranslationUnit
(de CompletionThread :: process, línea 271 ) son CXTranslationUnit_PrecompiledPreamble|CXTranslationUnit_CacheCompletionResults|CXTranslationUnit_SkipFunctionBodes
. Las banderas pasadas a clang_codeCompleteAt
(de CompletionThread :: process, línea 305 ) son CXCodeComplete_IncludeMacros|CXCodeComplete_IncludeCodePatterns
.
La llamada a clang_codeCompleteAt
es muy lenta: toma alrededor de 3-5 segundos obtener una finalización incluso en los casos en que la ubicación de finalización es un código de acceso de miembro legítimo, un subconjunto del caso de uso previsto mencionado en la documentación de clang_codeCompleteAt
. Esto parece demasiado lento para los estándares de finalización de código IDE. ¿Hay alguna forma de acelerar esto?
CXTranslationUnit_SkipFunctionBodies
, CXCodeComplete_IncludeMacros
, CXCodeComplete_IncludeCodePatterns
y no ver una diferencia significativa en la base de código que estoy trabajando con. Todos ellos promedian alrededor de 4 segundos por completo. Supongo que esto se debe solo al tamaño de las unidades de traducción. CXTranslationUnit_PrecompiledPreamble
asegura reparseTU
es muy rápido. Sin embargo, incluso con CXTranslationUnit_CacheCompletionResults
, clang_codeCompleteAt
es dolorosamente lento para mi caso de uso.