summaryrefslogtreecommitdiff
path: root/src/plugins/clangtools/virtualfilesystemoverlay.cpp
diff options
context:
space:
mode:
authorDavid Schulz <david.schulz@qt.io>2020-07-22 14:52:06 +0200
committerDavid Schulz <david.schulz@qt.io>2020-08-28 07:20:32 +0000
commite176958da112984a634b355142cdd5d59a748efc (patch)
tree388d14991d0bc58ddbf4d6bfe7bd528d95869caa /src/plugins/clangtools/virtualfilesystemoverlay.cpp
parent7f562c4d33a042fe51946c273581b2e9ad64159f (diff)
downloadqt-creator-e176958da112984a634b355142cdd5d59a748efc.tar.gz
ClangTools: Add automatic clang tool runner for open documents
Fixes: QTCREATORBUG-23349 Change-Id: I81197180c9d69c7df6184f8fcbf05f2256eaf7f6 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io> Reviewed-by: Christian Stenger <christian.stenger@qt.io> Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
Diffstat (limited to 'src/plugins/clangtools/virtualfilesystemoverlay.cpp')
-rw-r--r--src/plugins/clangtools/virtualfilesystemoverlay.cpp124
1 files changed, 124 insertions, 0 deletions
diff --git a/src/plugins/clangtools/virtualfilesystemoverlay.cpp b/src/plugins/clangtools/virtualfilesystemoverlay.cpp
new file mode 100644
index 0000000000..a0f9f2725c
--- /dev/null
+++ b/src/plugins/clangtools/virtualfilesystemoverlay.cpp
@@ -0,0 +1,124 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+****************************************************************************/
+
+#include "virtualfilesystemoverlay.h"
+
+#include <coreplugin/documentmanager.h>
+#include <texteditor/textdocument.h>
+
+#include <QJsonArray>
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QLoggingCategory>
+#include <QTextDocument>
+
+static Q_LOGGING_CATEGORY(LOG, "qtc.clangtools.vfso", QtWarningMsg)
+
+namespace ClangTools {
+namespace Internal {
+
+VirtualFileSystemOverlay::VirtualFileSystemOverlay(const QString &rootPattern)
+ : m_root(rootPattern)
+ , m_overlayFilePath(Utils::FilePath::fromString(m_root.filePath("vfso.yaml")))
+{ }
+
+void VirtualFileSystemOverlay::update()
+{
+ Utils::FileUtils::removeRecursively(overlayFilePath());
+ QFile overlayFile(m_overlayFilePath.toString());
+ if (!overlayFile.open(QFile::ReadWrite))
+ return;
+ std::map<Utils::FilePath, QList<Core::IDocument *>> documentRoots;
+ const QList<Core::IDocument *> &modifiedDocuments = Core::DocumentManager::modifiedDocuments();
+ QMap<Core::IDocument *, AutoSavedPath> newSaved;
+ for (Core::IDocument *doc : modifiedDocuments) {
+ auto document = qobject_cast<TextEditor::TextDocument *>(doc);
+ if (!document)
+ continue;
+ documentRoots[doc->filePath().absolutePath()] << doc;
+ AutoSavedPath saved = m_saved.take(document);
+ if (saved.revision != document->document()->revision()) {
+ saved.revision = document->document()->revision();
+ QString error;
+ saved.path = Utils::FilePath::fromString(m_root.path())
+ .pathAppended(doc->filePath().fileName() + ".auto");
+ while (saved.path.exists())
+ saved.path = saved.path + ".1";
+ if (!doc->save(&error, saved.path.toString(), true)) {
+ qCDebug(LOG) << error;
+ continue;
+ }
+ }
+ newSaved[doc] = saved;
+ }
+
+ for (const AutoSavedPath &path : qAsConst(m_saved)) {
+ QString error;
+ if (!Utils::FileUtils::removeRecursively(path.path, &error))
+ qCDebug(LOG) << error;
+ }
+ m_saved = newSaved;
+
+ auto toContent = [this](Core::IDocument *document) {
+ QJsonObject content;
+ content["name"] = document->filePath().fileName();
+ content["type"] = "file";
+ content["external-contents"] = m_saved[document].path.toUserOutput();
+ return content;
+ };
+
+ QJsonObject main;
+ main["version"] = 0;
+ QJsonArray jsonRoots;
+ for (auto [root, documents] : documentRoots) {
+ QJsonObject jsonRoot;
+ jsonRoot["type"] = "directory";
+ jsonRoot["name"] = root.toUserOutput();
+ QJsonArray contents;
+ for (auto doc : documents)
+ contents << toContent(doc);
+ jsonRoot["contents"] = contents;
+ jsonRoots << jsonRoot;
+ }
+ main["roots"] = jsonRoots;
+
+ QJsonDocument overlay(main);
+ if (!overlayFile.write(overlay.toJson(QJsonDocument::Compact)))
+ qCDebug(LOG) << "failed to write vfso to " << m_overlayFilePath;
+ overlayFile.close();
+}
+
+Utils::FilePath VirtualFileSystemOverlay::overlayFilePath() { return m_overlayFilePath; }
+
+Utils::FilePath VirtualFileSystemOverlay::filePath(Core::IDocument *doc)
+{
+ auto it = m_saved.find(doc);
+ if (it != m_saved.end())
+ return it.value().path;
+ return doc->filePath();
+}
+
+} // namespace Internal
+} // namespace ClangTools