diff options
Diffstat (limited to 'src/plugins/clangcodemodel/clangdclient.cpp')
-rw-r--r-- | src/plugins/clangcodemodel/clangdclient.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index 48cb1bf13b..5988d04d40 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -1142,6 +1142,7 @@ public: std::unordered_map<TextDocument *, CppEditor::SemanticHighlighter *> highlighters; QHash<TextDocument *, QPair<QList<ExpandedSemanticToken>, int>> previousTokens; + QHash<Utils::FilePath, CppEditor::BaseEditorDocumentParser::Configuration> parserConfigs; // The ranges of symbols referring to virtual functions, with document version, // as extracted by the highlighting procedure. @@ -1468,6 +1469,7 @@ void ClangdClient::handleDocumentClosed(TextDocument *doc) d->astCache.remove(doc); d->previousTokens.remove(doc); d->virtualRanges.remove(doc); + d->parserConfigs.remove(doc->filePath()); } QTextCursor ClangdClient::adjustedCursorForHighlighting(const QTextCursor &cursor, @@ -1625,6 +1627,39 @@ void ClangdClient::handleUiHeaderChange(const QString &fileName) } } +void ClangdClient::updateParserConfig(const Utils::FilePath &filePath, + const CppEditor::BaseEditorDocumentParser::Configuration &config) +{ + if (config.preferredProjectPartId.isEmpty()) + return; + + CppEditor::BaseEditorDocumentParser::Configuration &cachedConfig = d->parserConfigs[filePath]; + if (cachedConfig == config) + return; + cachedConfig = config; + + // TODO: Also handle editorDefines (and usePrecompiledHeaders?) + const auto projectPart = CppEditor::CppModelManager::instance() + ->projectPartForId(config.preferredProjectPartId); + if (!projectPart) + return; + const CppEditor::ClangDiagnosticConfig projectWarnings = warningsConfigForProject(project()); + const QStringList projectOptions = optionsForProject(project()); + QJsonObject cdbChanges; + QStringList args = createClangOptions(*projectPart, filePath.toString(), projectWarnings, + projectOptions); + args.prepend("clang"); + args.append(filePath.toString()); + QJsonObject value; + value.insert("workingDirectory", filePath.parentDir().toString()); + value.insert("compilationCommand", QJsonArray::fromStringList(args)); + cdbChanges.insert(filePath.toUserOutput(), value); + const QJsonObject settings({qMakePair(QString("compilationDatabaseChanges"), cdbChanges)}); + DidChangeConfigurationParams configChangeParams; + configChangeParams.setSettings(settings); + sendContent(DidChangeConfigurationNotification(configChangeParams)); +} + void ClangdClient::Private::handleFindUsagesResult(quint64 key, const QList<Location> &locations) { const auto refData = runningFindUsages.find(key); |