diff options
author | Marcus Tillmanns <marcus.tillmanns@qt.io> | 2022-06-21 10:06:47 +0200 |
---|---|---|
committer | Marcus Tillmanns <marcus.tillmanns@qt.io> | 2022-06-21 13:33:19 +0000 |
commit | 627f6a2916f1a53cc2d5a775818b0d610d1dd9c0 (patch) | |
tree | a74dac7912d6e65c87ec42545c287106bdbc35ff | |
parent | bbbae099a741ed1eaf305cae72452d1ae2ca0c4e (diff) |
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 <christian.kandeler@qt.io>
-rw-r--r-- | src/libs/qmljs/qmljsfindexportedcpptypes.cpp | 2 | ||||
-rw-r--r-- | src/libs/qmljs/qmljslink.cpp | 3 | ||||
-rw-r--r-- | src/plugins/cppeditor/cppeditordocument.cpp | 51 | ||||
-rw-r--r-- | src/plugins/cppeditor/cppeditordocument.h | 2 | ||||
-rw-r--r-- | src/plugins/cppeditor/cppmodelmanager.cpp | 16 | ||||
-rw-r--r-- | 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 40358b6c95..72a4cfad51 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 fe3301db93..df881a09ab 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 e7621e823e..80a8cce0bd 100644 --- a/src/plugins/cppeditor/cppeditordocument.cpp +++ b/src/plugins/cppeditor/cppeditordocument.cpp @@ -50,7 +50,9 @@ #include <utils/minimizableinfobars.h> #include <utils/qtcassert.h> #include <utils/runextensions.h> +#include <utils/utilsicons.h> +#include <QApplication> #include <QTextDocument> 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 54009a04eb..09d5ab96b6 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 f646631a90..7bbf588383 100644 --- a/src/plugins/cppeditor/cppmodelmanager.cpp +++ b/src/plugins/cppeditor/cppmodelmanager.cpp @@ -201,6 +201,8 @@ public: std::unique_ptr<Core::ILocatorFilter> m_functionsFilter; std::unique_ptr<Core::IFindFilter> m_symbolsFindFilter; std::unique_ptr<Core::ILocatorFilter> m_currentDocumentFilter; + + QList<Document::DiagnosticMessage> 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<Document::DiagnosticMessage> &diagnostics) +{ + d->m_diagnosticMessages = diagnostics; + emit diagnosticsChanged(fileName, kind); + return true; +} + +const QList<Document::DiagnosticMessage> CppModelManager::diagnosticMessages() +{ + return d->m_diagnosticMessages; +} + } // namespace CppEditor diff --git a/src/plugins/cppeditor/cppmodelmanager.h b/src/plugins/cppeditor/cppmodelmanager.h index 3526bb5fbe..efccd52119 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<Document::DiagnosticMessage> &diagnostics) override; + + const QList<Document::DiagnosticMessage> diagnosticMessages(); + QList<ProjectInfo::ConstPtr> projectInfos() const; ProjectInfo::ConstPtr projectInfo(ProjectExplorer::Project *project) const; QFuture<void> 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(); |