From 627f6a2916f1a53cc2d5a775818b0d610d1dd9c0 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Tue, 21 Jun 2022 10:06:47 +0200 Subject: [PATCH] cppeditor: Show hints for qmlRegister... diagnostics This fixes passing the hints from FindExportedCppTypes to the actual cppeditor so they can be displayed to the user. Fixes: QTCREATORBUG-27243 Change-Id: Ibcb68296f044a9c6a96f40945d8a0e964be7f042 Reviewed-by: Christian Kandeler --- src/libs/qmljs/qmljsfindexportedcpptypes.cpp | 2 +- src/libs/qmljs/qmljslink.cpp | 3 +- src/plugins/cppeditor/cppeditordocument.cpp | 51 ++++++++++++++++++++ src/plugins/cppeditor/cppeditordocument.h | 2 + src/plugins/cppeditor/cppmodelmanager.cpp | 16 ++++++ src/plugins/cppeditor/cppmodelmanager.h | 8 +++ 6 files changed, 80 insertions(+), 2 deletions(-) diff --git a/src/libs/qmljs/qmljsfindexportedcpptypes.cpp b/src/libs/qmljs/qmljsfindexportedcpptypes.cpp index 40358b6c954..72a4cfad511 100644 --- a/src/libs/qmljs/qmljsfindexportedcpptypes.cpp +++ b/src/libs/qmljs/qmljsfindexportedcpptypes.cpp @@ -334,7 +334,7 @@ protected: _doc->fileName(), line, column, QmlJS::FindExportedCppTypes::tr( - "The module URI cannot be determined by static analysis. The type will be available\n" + "The module URI cannot be determined by static analysis. The type will not be available\n" "globally in the QML editor. You can add a \"// @uri My.Module.Uri\" annotation to let\n" "the QML editor know about a likely URI.")); } diff --git a/src/libs/qmljs/qmljslink.cpp b/src/libs/qmljs/qmljslink.cpp index fe3301db933..df881a09ab4 100644 --- a/src/libs/qmljs/qmljslink.cpp +++ b/src/libs/qmljs/qmljslink.cpp @@ -465,7 +465,8 @@ Import LinkPrivate::importNonFile(const Document::Ptr &doc, const ImportInfo &im "For Qbs projects, declare and set a qmlImportPaths property in your product " "to add import paths.\n" "For qmlproject projects, use the importPaths property to add import paths.\n" - "For CMake projects, make sure QML_IMPORT_PATH variable is in CMakeCache.txt.\n") + "For CMake projects, make sure QML_IMPORT_PATH variable is in CMakeCache.txt.\n" + "For qmlRegister... calls, make sure that you define the Module URI as a string literal.\n") .arg(importInfo.name(), m_importPaths.join(QLatin1Char('\n')))); } diff --git a/src/plugins/cppeditor/cppeditordocument.cpp b/src/plugins/cppeditor/cppeditordocument.cpp index e7621e823ee..80a8cce0bd3 100644 --- a/src/plugins/cppeditor/cppeditordocument.cpp +++ b/src/plugins/cppeditor/cppeditordocument.cpp @@ -50,7 +50,9 @@ #include #include #include +#include +#include #include const char NO_PROJECT_CONFIGURATION[] = "NoProject"; @@ -121,6 +123,9 @@ CppEditorDocument::CppEditorDocument() connect(this, &IDocument::filePathChanged, this, &CppEditorDocument::onFilePathChanged); + connect(mm(), &CppModelManager::diagnosticsChanged, + this, &CppEditorDocument::onDiagnosticsChanged); + connect(&m_parseContextModel, &ParseContextModel::preferredParseContextChanged, this, &CppEditorDocument::reparseWithPreferredParseContext); @@ -483,5 +488,51 @@ bool CppEditorDocument::save(QString *errorString, const FilePath &filePath, boo return TextEditor::TextDocument::save(errorString, filePath, autoSave); } +void CppEditorDocument::onDiagnosticsChanged(const QString &fileName, const QString &kind) +{ + if (FilePath::fromString(fileName) != filePath()) + return; + + TextMarks removedMarks = marks(); + + const Utils::Id category = Utils::Id::fromString(kind); + + for (const auto &diagnostic : mm()->diagnosticMessages()) { + if (FilePath::fromString(diagnostic.fileName()) == filePath()) { + auto it = std::find_if(std::begin(removedMarks), + std::end(removedMarks), + [&category, &diagnostic](TextMark *existing) { + return (diagnostic.line() == existing->lineNumber() + && diagnostic.text() == existing->lineAnnotation() + && category == existing->category()); + }); + + if (it != std::end(removedMarks)) { + removedMarks.erase(it); + continue; + } + + auto mark = new TextMark(filePath(), diagnostic.line(), category); + mark->setLineAnnotation(diagnostic.text()); + mark->setToolTip(diagnostic.text()); + + mark->setIcon(diagnostic.isWarning() ? Utils::Icons::CODEMODEL_WARNING.icon() + : Utils::Icons::CODEMODEL_ERROR.icon()); + mark->setColor(diagnostic.isWarning() ? Utils::Theme::CodeModel_Warning_TextMarkColor + : Utils::Theme::CodeModel_Error_TextMarkColor); + mark->setPriority(diagnostic.isWarning() ? TextEditor::TextMark::NormalPriority + : TextEditor::TextMark::HighPriority); + addMark(mark); + } + } + + for (auto it = removedMarks.begin(); it != removedMarks.end(); ++it) { + if ((*it)->category() == category) { + removeMark(*it); + delete *it; + } + } +} + } // namespace Internal } // namespace CppEditor diff --git a/src/plugins/cppeditor/cppeditordocument.h b/src/plugins/cppeditor/cppeditordocument.h index 54009a04ebd..09d5ab96b63 100644 --- a/src/plugins/cppeditor/cppeditordocument.h +++ b/src/plugins/cppeditor/cppeditordocument.h @@ -94,6 +94,8 @@ private: void onAboutToReload(); void onReloadFinished(); + void onDiagnosticsChanged(const QString &fileName, const QString &kind); + void reparseWithPreferredParseContext(const QString &id); diff --git a/src/plugins/cppeditor/cppmodelmanager.cpp b/src/plugins/cppeditor/cppmodelmanager.cpp index f646631a90e..7bbf588383f 100644 --- a/src/plugins/cppeditor/cppmodelmanager.cpp +++ b/src/plugins/cppeditor/cppmodelmanager.cpp @@ -201,6 +201,8 @@ public: std::unique_ptr m_functionsFilter; std::unique_ptr m_symbolsFindFilter; std::unique_ptr m_currentDocumentFilter; + + QList m_diagnosticMessages; }; } // namespace Internal @@ -1704,4 +1706,18 @@ QThreadPool *CppModelManager::sharedThreadPool() return &d->m_threadPool; } +bool CppModelManager::setExtraDiagnostics(const QString &fileName, + const QString &kind, + const QList &diagnostics) +{ + d->m_diagnosticMessages = diagnostics; + emit diagnosticsChanged(fileName, kind); + return true; +} + +const QList CppModelManager::diagnosticMessages() +{ + return d->m_diagnosticMessages; +} + } // namespace CppEditor diff --git a/src/plugins/cppeditor/cppmodelmanager.h b/src/plugins/cppeditor/cppmodelmanager.h index 3526bb5fbe0..efccd521190 100644 --- a/src/plugins/cppeditor/cppmodelmanager.h +++ b/src/plugins/cppeditor/cppmodelmanager.h @@ -104,6 +104,12 @@ public: QByteArray codeModelConfiguration() const; CppLocatorData *locatorData() const; + bool setExtraDiagnostics(const QString &fileName, + const QString &kind, + const QList &diagnostics) override; + + const QList diagnosticMessages(); + QList projectInfos() const; ProjectInfo::ConstPtr projectInfo(ProjectExplorer::Project *project) const; QFuture updateProjectInfo(const ProjectInfo::ConstPtr &newProjectInfo, @@ -256,6 +262,8 @@ signals: void abstractEditorSupportRemoved(const QString &filePath); void fallbackProjectPartUpdated(); + void diagnosticsChanged(const QString &fileName, const QString &kind); + public slots: void updateModifiedSourceFiles(); void GC();