From 514a96c75fb63e91ba2080679d6aa05db02666cc Mon Sep 17 00:00:00 2001
From: Marco Bubke <marco.bubke@theqtcompany.com>
Date: Mon, 30 Nov 2015 16:10:28 +0100
Subject: [PATCH] Clang: Don't reparse before code completion

Task-number: QTCREATORBUG-15365
Change-Id: I37f623449fa95268f1a0a5d5e66d75df0582c183
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@theqtcompany.com>
---
 src/tools/clangbackend/ipcsource/clangipcserver.cpp      | 2 +-
 .../clangbackend/ipcsource/clangtranslationunit.cpp      | 9 ++++++++-
 src/tools/clangbackend/ipcsource/clangtranslationunit.h  | 1 +
 src/tools/clangbackend/ipcsource/codecompleter.cpp       | 2 +-
 tests/unit/unittest/codecompletiontest.cpp               | 2 +-
 5 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/src/tools/clangbackend/ipcsource/clangipcserver.cpp b/src/tools/clangbackend/ipcsource/clangipcserver.cpp
index 311169ac6e0..90e9738175c 100644
--- a/src/tools/clangbackend/ipcsource/clangipcserver.cpp
+++ b/src/tools/clangbackend/ipcsource/clangipcserver.cpp
@@ -66,7 +66,7 @@
 namespace ClangBackEnd {
 
 namespace {
-const int delayedDocumentAnnotationsTimerInterval = 300;
+const int delayedDocumentAnnotationsTimerInterval = 500;
 }
 
 ClangIpcServer::ClangIpcServer()
diff --git a/src/tools/clangbackend/ipcsource/clangtranslationunit.cpp b/src/tools/clangbackend/ipcsource/clangtranslationunit.cpp
index a7dd59f27e0..5df086781ff 100644
--- a/src/tools/clangbackend/ipcsource/clangtranslationunit.cpp
+++ b/src/tools/clangbackend/ipcsource/clangtranslationunit.cpp
@@ -173,12 +173,19 @@ CXIndex TranslationUnit::index() const
 }
 
 CXTranslationUnit TranslationUnit::cxTranslationUnit() const
+{
+    cxTranslationUnitWithoutReparsing();
+    reparseTranslationUnitIfFilesAreChanged();
+
+    return d->translationUnit;
+}
+
+CXTranslationUnit TranslationUnit::cxTranslationUnitWithoutReparsing() const
 {
     checkIfNull();
     checkIfFileExists();
     removeTranslationUnitIfProjectPartWasChanged();
     createTranslationUnitIfNeeded();
-    reparseTranslationUnitIfFilesAreChanged();
 
     return d->translationUnit;
 }
diff --git a/src/tools/clangbackend/ipcsource/clangtranslationunit.h b/src/tools/clangbackend/ipcsource/clangtranslationunit.h
index 2e325ceaf62..61d58c804cd 100644
--- a/src/tools/clangbackend/ipcsource/clangtranslationunit.h
+++ b/src/tools/clangbackend/ipcsource/clangtranslationunit.h
@@ -97,6 +97,7 @@ public:
 
     CXIndex index() const;
     CXTranslationUnit cxTranslationUnit() const;
+    CXTranslationUnit cxTranslationUnitWithoutReparsing() const;
     CXUnsavedFile * cxUnsavedFiles() const;
     uint unsavedFilesCount() const;
 
diff --git a/src/tools/clangbackend/ipcsource/codecompleter.cpp b/src/tools/clangbackend/ipcsource/codecompleter.cpp
index 99d0637a03e..b628c51eb8f 100644
--- a/src/tools/clangbackend/ipcsource/codecompleter.cpp
+++ b/src/tools/clangbackend/ipcsource/codecompleter.cpp
@@ -49,7 +49,7 @@ CodeCompleter::CodeCompleter(TranslationUnit translationUnit)
 
 CodeCompletions CodeCompleter::complete(uint line, uint column)
 {
-    ClangCodeCompleteResults completeResults(clang_codeCompleteAt(translationUnit.cxTranslationUnit(),
+    ClangCodeCompleteResults completeResults(clang_codeCompleteAt(translationUnit.cxTranslationUnitWithoutReparsing(),
                                                                   translationUnit.filePath().constData(),
                                                                   line,
                                                                   column,
diff --git a/tests/unit/unittest/codecompletiontest.cpp b/tests/unit/unittest/codecompletiontest.cpp
index 3fbc7d0a203..efbf7ea5901 100644
--- a/tests/unit/unittest/codecompletiontest.cpp
+++ b/tests/unit/unittest/codecompletiontest.cpp
@@ -225,7 +225,7 @@ TEST_F(CodeCompleter, DISABLED_FunctionInChangedIncludedHeader)
                                           CodeCompletion::FunctionCompletionKind)));
 }
 
-TEST_F(CodeCompleter, FunctionInChangedIncludedHeaderWithUnsavedContentInMainFile)
+TEST_F(CodeCompleter, DISABLED_FunctionInChangedIncludedHeaderWithUnsavedContentInMainFile) // it's not that bad because we reparse anyway
 {
     unsavedFiles.createOrUpdate({unsavedMainFileContainer});
     translationUnits.update({unsavedMainFileContainer});
-- 
GitLab