summaryrefslogtreecommitdiff
path: root/src/tools/clangbackend/ipcsource
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/clangbackend/ipcsource')
-rw-r--r--src/tools/clangbackend/ipcsource/clangipcserver.cpp13
-rw-r--r--src/tools/clangbackend/ipcsource/codecompleter.cpp4
-rw-r--r--src/tools/clangbackend/ipcsource/codecompleter.h2
-rw-r--r--src/tools/clangbackend/ipcsource/codecompletionchunkconverter.cpp4
-rw-r--r--src/tools/clangbackend/ipcsource/codecompletionchunkconverter.h6
-rw-r--r--src/tools/clangbackend/ipcsource/codecompletionsextractor.cpp4
-rw-r--r--src/tools/clangbackend/ipcsource/codecompletionsextractor.h2
-rw-r--r--src/tools/clangbackend/ipcsource/translationunit.cpp69
-rw-r--r--src/tools/clangbackend/ipcsource/translationunit.h14
9 files changed, 54 insertions, 64 deletions
diff --git a/src/tools/clangbackend/ipcsource/clangipcserver.cpp b/src/tools/clangbackend/ipcsource/clangipcserver.cpp
index e8b860520b..6ba3b0af5d 100644
--- a/src/tools/clangbackend/ipcsource/clangipcserver.cpp
+++ b/src/tools/clangbackend/ipcsource/clangipcserver.cpp
@@ -30,6 +30,7 @@
#include "clangipcserver.h"
+#include <clangbackendipcdebugutils.h>
#include <cmbcodecompletedcommand.h>
#include <cmbcompletecodecommand.h>
#include <cmbregisterprojectsforcodecompletioncommand.h>
@@ -64,6 +65,8 @@ void ClangIpcServer::end()
void ClangIpcServer::registerTranslationUnitsForCodeCompletion(const ClangBackEnd::RegisterTranslationUnitForCodeCompletionCommand &command)
{
+ TIME_SCOPE_DURATION("ClangIpcServer::registerTranslationUnitsForCodeCompletion");
+
try {
translationUnits.createOrUpdate(command.fileContainers());
unsavedFiles.createOrUpdate(command.fileContainers());
@@ -76,6 +79,8 @@ void ClangIpcServer::registerTranslationUnitsForCodeCompletion(const ClangBackEn
void ClangIpcServer::unregisterTranslationUnitsForCodeCompletion(const ClangBackEnd::UnregisterTranslationUnitsForCodeCompletionCommand &command)
{
+ TIME_SCOPE_DURATION("ClangIpcServer::unregisterTranslationUnitsForCodeCompletion");
+
try {
translationUnits.remove(command.fileContainers());
} catch (const TranslationUnitDoesNotExistException &exception) {
@@ -89,6 +94,8 @@ void ClangIpcServer::unregisterTranslationUnitsForCodeCompletion(const ClangBack
void ClangIpcServer::registerProjectPartsForCodeCompletion(const RegisterProjectPartsForCodeCompletionCommand &command)
{
+ TIME_SCOPE_DURATION("ClangIpcServer::registerProjectPartsForCodeCompletion");
+
try {
projects.createOrUpdate(command.projectContainers());
} catch (const std::exception &exception) {
@@ -98,6 +105,8 @@ void ClangIpcServer::registerProjectPartsForCodeCompletion(const RegisterProject
void ClangIpcServer::unregisterProjectPartsForCodeCompletion(const UnregisterProjectPartsForCodeCompletionCommand &command)
{
+ TIME_SCOPE_DURATION("ClangIpcServer::unregisterProjectPartsForCodeCompletion");
+
try {
projects.remove(command.projectPartIds());
} catch (const ProjectPartDoNotExistException &exception) {
@@ -109,6 +118,8 @@ void ClangIpcServer::unregisterProjectPartsForCodeCompletion(const UnregisterPro
void ClangIpcServer::completeCode(const ClangBackEnd::CompleteCodeCommand &command)
{
+ TIME_SCOPE_DURATION("ClangIpcServer::completeCode");
+
try {
CodeCompleter codeCompleter(translationUnits.translationUnit(command.filePath(), command.projectPartId()));
@@ -120,7 +131,7 @@ void ClangIpcServer::completeCode(const ClangBackEnd::CompleteCodeCommand &comma
} catch (const ProjectPartDoNotExistException &exception) {
client()->projectPartsDoNotExist(ProjectPartsDoNotExistCommand(exception.projectPartIds()));
} catch (const std::exception &exception) {
- qWarning() << "Error in ClangIpcServer::unregisterProjectPartsForCodeCompletion:" << exception.what();
+ qWarning() << "Error in ClangIpcServer::completeCode:" << exception.what();
}
}
diff --git a/src/tools/clangbackend/ipcsource/codecompleter.cpp b/src/tools/clangbackend/ipcsource/codecompleter.cpp
index e8f88b4c1d..0f50a1fe86 100644
--- a/src/tools/clangbackend/ipcsource/codecompleter.cpp
+++ b/src/tools/clangbackend/ipcsource/codecompleter.cpp
@@ -47,8 +47,10 @@ CodeCompleter::CodeCompleter(TranslationUnit translationUnit)
{
}
-QVector<CodeCompletion> CodeCompleter::complete(uint line, uint column)
+CodeCompletions CodeCompleter::complete(uint line, uint column)
{
+ translationUnit.reparse();
+
ClangCodeCompleteResults completeResults(clang_codeCompleteAt(translationUnit.cxTranslationUnit(),
translationUnit.filePath().constData(),
line,
diff --git a/src/tools/clangbackend/ipcsource/codecompleter.h b/src/tools/clangbackend/ipcsource/codecompleter.h
index 488abc4987..2d2dc1abe0 100644
--- a/src/tools/clangbackend/ipcsource/codecompleter.h
+++ b/src/tools/clangbackend/ipcsource/codecompleter.h
@@ -47,7 +47,7 @@ public:
CodeCompleter() = default;
CodeCompleter(TranslationUnit translationUnit);
- QVector<CodeCompletion> complete(uint line, uint column);
+ CodeCompletions complete(uint line, uint column);
private:
Utf8String filePath() const;
diff --git a/src/tools/clangbackend/ipcsource/codecompletionchunkconverter.cpp b/src/tools/clangbackend/ipcsource/codecompletionchunkconverter.cpp
index f58f6bda81..03adf6e13c 100644
--- a/src/tools/clangbackend/ipcsource/codecompletionchunkconverter.cpp
+++ b/src/tools/clangbackend/ipcsource/codecompletionchunkconverter.cpp
@@ -71,7 +71,7 @@ CodeCompletionChunk::Kind CodeCompletionChunkConverter::chunkKind(CXCompletionSt
return CodeCompletionChunk::Kind(clang_getCompletionChunkKind(completionString, chunkIndex));
}
-QVector<CodeCompletionChunk> CodeCompletionChunkConverter::extract(CXCompletionString completionString)
+CodeCompletionChunks CodeCompletionChunkConverter::extract(CXCompletionString completionString)
{
CodeCompletionChunkConverter converter;
@@ -85,7 +85,7 @@ Utf8String CodeCompletionChunkConverter::chunkText(CXCompletionString completion
return ClangString(clang_getCompletionChunkText(completionString, chunkIndex));
}
-QVector<CodeCompletionChunk> CodeCompletionChunkConverter::optionalChunks(CXCompletionString completionString, uint chunkIndex)
+CodeCompletionChunks CodeCompletionChunkConverter::optionalChunks(CXCompletionString completionString, uint chunkIndex)
{
CodeCompletionChunkConverter converter;
diff --git a/src/tools/clangbackend/ipcsource/codecompletionchunkconverter.h b/src/tools/clangbackend/ipcsource/codecompletionchunkconverter.h
index a3b92de62b..6907690e81 100644
--- a/src/tools/clangbackend/ipcsource/codecompletionchunkconverter.h
+++ b/src/tools/clangbackend/ipcsource/codecompletionchunkconverter.h
@@ -42,18 +42,18 @@ namespace ClangBackEnd {
class CodeCompletionChunkConverter
{
public:
- static QVector<CodeCompletionChunk> extract(CXCompletionString completionString);
+ static CodeCompletionChunks extract(CXCompletionString completionString);
static Utf8String chunkText(CXCompletionString completionString, uint chunkIndex);
private:
- QVector<CodeCompletionChunk> optionalChunks(CXCompletionString completionString, uint chunkIndex);
+ CodeCompletionChunks optionalChunks(CXCompletionString completionString, uint chunkIndex);
static CodeCompletionChunk::Kind chunkKind(CXCompletionString completionString, uint chunkIndex);
void extractCompletionChunks(CXCompletionString completionString);
void extractOptionalCompletionChunks(CXCompletionString completionString);
private:
- QVector<CodeCompletionChunk> chunks;
+ CodeCompletionChunks chunks;
};
} // namespace ClangBackEnd
diff --git a/src/tools/clangbackend/ipcsource/codecompletionsextractor.cpp b/src/tools/clangbackend/ipcsource/codecompletionsextractor.cpp
index 56e826db6f..1a3e7cb9c3 100644
--- a/src/tools/clangbackend/ipcsource/codecompletionsextractor.cpp
+++ b/src/tools/clangbackend/ipcsource/codecompletionsextractor.cpp
@@ -88,9 +88,9 @@ bool CodeCompletionsExtractor::peek(const Utf8String &name)
return false;
}
-QVector<CodeCompletion> CodeCompletionsExtractor::extractAll()
+CodeCompletions CodeCompletionsExtractor::extractAll()
{
- QVector<CodeCompletion> codeCompletions;
+ CodeCompletions codeCompletions;
codeCompletions.reserve(cxCodeCompleteResults->NumResults);
while (next())
diff --git a/src/tools/clangbackend/ipcsource/codecompletionsextractor.h b/src/tools/clangbackend/ipcsource/codecompletionsextractor.h
index f01b12b64c..dbfbb8af4b 100644
--- a/src/tools/clangbackend/ipcsource/codecompletionsextractor.h
+++ b/src/tools/clangbackend/ipcsource/codecompletionsextractor.h
@@ -53,7 +53,7 @@ public:
bool next();
bool peek(const Utf8String &name);
- QVector<CodeCompletion> extractAll();
+ CodeCompletions extractAll();
const CodeCompletion &currentCodeCompletion() const;
diff --git a/src/tools/clangbackend/ipcsource/translationunit.cpp b/src/tools/clangbackend/ipcsource/translationunit.cpp
index 17871176fa..9581cb5750 100644
--- a/src/tools/clangbackend/ipcsource/translationunit.cpp
+++ b/src/tools/clangbackend/ipcsource/translationunit.cpp
@@ -40,6 +40,9 @@
#include <utf8string.h>
#include <QFileInfo>
+#include <QLoggingCategory>
+
+static Q_LOGGING_CATEGORY(verboseLibLog, "qtc.clangbackend.verboselib");
namespace ClangBackEnd {
@@ -52,8 +55,7 @@ public:
~TranslationUnitData();
public:
- time_point lastProjectPartChangeTimePoint;
- time_point lastUnsavedFilesChangeTimePoint;
+ time_point lastChangeTimePoint;
ProjectPart projectPart;
Utf8String filePath;
CXTranslationUnit translationUnit = nullptr;
@@ -64,8 +66,7 @@ public:
TranslationUnitData::TranslationUnitData(const Utf8String &filePath,
const UnsavedFiles &unsavedFiles,
const ProjectPart &projectPart)
- : lastProjectPartChangeTimePoint(std::chrono::steady_clock::now()),
- lastUnsavedFilesChangeTimePoint(lastProjectPartChangeTimePoint),
+ : lastChangeTimePoint(std::chrono::steady_clock::now()),
projectPart(projectPart),
filePath(filePath),
unsavedFiles(unsavedFiles)
@@ -98,12 +99,21 @@ void TranslationUnit::reset()
d.reset();
}
+void TranslationUnit::reparse()
+{
+ cxTranslationUnit();
+
+ reparseTranslationUnit();
+}
+
CXIndex TranslationUnit::index() const
{
checkIfNull();
- if (!d->index)
- d->index = clang_createIndex(1, 1);
+ if (!d->index) {
+ const bool displayDiagnostics = verboseLibLog().isDebugEnabled();
+ d->index = clang_createIndex(1, displayDiagnostics);
+ }
return d->index;
}
@@ -111,9 +121,10 @@ CXIndex TranslationUnit::index() const
CXTranslationUnit TranslationUnit::cxTranslationUnit() const
{
checkIfNull();
- removeTranslationUnitIfProjectPartWasChanged();
+
+ removeOutdatedTranslationUnit();
+
createTranslationUnitIfNeeded();
- reparseTranslationUnitIfUnsavedFilesAreChanged();
return d->translationUnit;
}
@@ -132,19 +143,9 @@ const Utf8String &TranslationUnit::projectPartId() const
return d->projectPart.projectPartId();
}
-const time_point &TranslationUnit::lastProjectPartChangeTimePoint() const
-{
- return d->lastProjectPartChangeTimePoint;
-}
-
-const time_point &TranslationUnit::lastUnsavedFilesChangeTimePoint() const
+const time_point &TranslationUnit::lastChangeTimePoint() const
{
- return d->lastUnsavedFilesChangeTimePoint;
-}
-
-bool TranslationUnit::isNeedingReparse() const
-{
- return d->lastUnsavedFilesChangeTimePoint < d->unsavedFiles.lastChangeTimePoint();
+ return d->lastChangeTimePoint;
}
void TranslationUnit::checkIfNull() const
@@ -159,29 +160,19 @@ void TranslationUnit::checkIfFileExists() const
throw TranslationUnitFileNotExitsException(d->filePath);
}
-void TranslationUnit::updateLastProjectPartChangeTimePoint() const
-{
- d->lastProjectPartChangeTimePoint = std::chrono::steady_clock::now();
-}
-
-void TranslationUnit::updateLastUnsavedFilesChangeTimePoint() const
+void TranslationUnit::updateLastChangeTimePoint() const
{
- d->lastUnsavedFilesChangeTimePoint = std::chrono::steady_clock::now();
+ d->lastChangeTimePoint = std::chrono::steady_clock::now();
}
-void TranslationUnit::removeTranslationUnitIfProjectPartWasChanged() const
+void TranslationUnit::removeOutdatedTranslationUnit() const
{
- if (projectPartIsOutdated()) {
+ if (d->projectPart.lastChangeTimePoint() >= d->lastChangeTimePoint) {
clang_disposeTranslationUnit(d->translationUnit);
d->translationUnit = nullptr;
}
}
-bool TranslationUnit::projectPartIsOutdated() const
-{
- return d->projectPart.lastChangeTimePoint() >= d->lastProjectPartChangeTimePoint;
-}
-
void TranslationUnit::createTranslationUnitIfNeeded() const
{
if (!d->translationUnit) {
@@ -201,7 +192,7 @@ void TranslationUnit::createTranslationUnitIfNeeded() const
// e.g. clang_codeCompleteAt() dramatically.
reparseTranslationUnit();
- updateLastProjectPartChangeTimePoint();
+ updateLastChangeTimePoint();
}
}
@@ -219,14 +210,6 @@ void TranslationUnit::reparseTranslationUnit() const
d->unsavedFiles.count(),
d->unsavedFiles.cxUnsavedFiles(),
clang_defaultReparseOptions(d->translationUnit));
-
- updateLastUnsavedFilesChangeTimePoint();
-}
-
-void TranslationUnit::reparseTranslationUnitIfUnsavedFilesAreChanged() const
-{
- if (isNeedingReparse())
- reparseTranslationUnit();
}
int TranslationUnit::defaultOptions()
diff --git a/src/tools/clangbackend/ipcsource/translationunit.h b/src/tools/clangbackend/ipcsource/translationunit.h
index 5491f0acec..803e5e9c27 100644
--- a/src/tools/clangbackend/ipcsource/translationunit.h
+++ b/src/tools/clangbackend/ipcsource/translationunit.h
@@ -73,6 +73,7 @@ public:
bool isNull() const;
void reset();
+ void reparse();
CXIndex index() const;
CXTranslationUnit cxTranslationUnit() const;
@@ -82,23 +83,16 @@ public:
const Utf8String &filePath() const;
const Utf8String &projectPartId() const;
- const time_point &lastProjectPartChangeTimePoint() const;
- const time_point &lastUnsavedFilesChangeTimePoint() const;
-
- bool isNeedingReparse() const;
+ const time_point &lastChangeTimePoint() const;
private:
void checkIfNull() const;
void checkIfFileExists() const;
- void updateLastProjectPartChangeTimePoint() const;
- void updateLastUnsavedFilesChangeTimePoint() const;
- void removeTranslationUnitIfProjectPartWasChanged() const;
- bool projectPartIsOutdated() const;
+ void updateLastChangeTimePoint() const;
+ void removeOutdatedTranslationUnit() const;
void createTranslationUnitIfNeeded() const;
void checkTranslationUnitErrorCode(CXErrorCode errorCode) const;
void reparseTranslationUnit() const;
- void reparseTranslationUnitIfUnsavedFilesAreChanged() const;
- void printIncludes() const;
static int defaultOptions();
private: