diff options
Diffstat (limited to 'src/tools/clangbackend/ipcsource')
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 ¤tCodeCompletion() 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: |