diff --git a/src/tools/clangbackend/ipcsource/translationunit.cpp b/src/tools/clangbackend/ipcsource/translationunit.cpp index f44d6989819..f74b555f383 100644 --- a/src/tools/clangbackend/ipcsource/translationunit.cpp +++ b/src/tools/clangbackend/ipcsource/translationunit.cpp @@ -163,10 +163,6 @@ void TranslationUnit::removeOutdatedTranslationUnit() const void TranslationUnit::createTranslationUnitIfNeeded() const { - const auto options = CXTranslationUnit_CacheCompletionResults - | CXTranslationUnit_PrecompiledPreamble - | CXTranslationUnit_SkipFunctionBodies; - if (!d->translationUnit) { d->translationUnit = CXTranslationUnit(); CXErrorCode errorCode = clang_parseTranslationUnit2(index(), @@ -175,11 +171,15 @@ void TranslationUnit::createTranslationUnitIfNeeded() const d->projectPart.argumentCount(), d->unsavedFiles.cxUnsavedFiles(), d->unsavedFiles.count(), - options, + defaultOptions(), &d->translationUnit); checkTranslationUnitErrorCode(errorCode); + // We need to reparse to create the precompiled preamble, which will speed up further calls, + // e.g. clang_codeCompleteAt() dramatically. + reparseTranslationUnit(); + updateLastChangeTimePoint(); } } @@ -192,6 +192,21 @@ void TranslationUnit::checkTranslationUnitErrorCode(CXErrorCode errorCode) const } } +void TranslationUnit::reparseTranslationUnit() const +{ + clang_reparseTranslationUnit(d->translationUnit, + d->unsavedFiles.count(), + d->unsavedFiles.cxUnsavedFiles(), + clang_defaultReparseOptions(d->translationUnit)); +} + +int TranslationUnit::defaultOptions() +{ + return CXTranslationUnit_CacheCompletionResults + | CXTranslationUnit_PrecompiledPreamble + | CXTranslationUnit_SkipFunctionBodies; +} + uint TranslationUnit::unsavedFilesCount() const { return d->unsavedFiles.count(); diff --git a/src/tools/clangbackend/ipcsource/translationunit.h b/src/tools/clangbackend/ipcsource/translationunit.h index 5383023869e..75dd39e8614 100644 --- a/src/tools/clangbackend/ipcsource/translationunit.h +++ b/src/tools/clangbackend/ipcsource/translationunit.h @@ -91,6 +91,8 @@ private: void removeOutdatedTranslationUnit() const; void createTranslationUnitIfNeeded() const; void checkTranslationUnitErrorCode(CXErrorCode errorCode) const; + void reparseTranslationUnit() const; + static int defaultOptions(); private: mutable std::shared_ptr d;