diff --git a/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp b/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp index 0e3d70ec9dd..71afe79bf17 100644 --- a/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp +++ b/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp @@ -352,13 +352,17 @@ void ClangDiagnosticManager::addFixItAvailableMarker( QSet &lineNumbersWithFixItMarker) { for (auto &&diagnostic : diagnostics) { - const int line = int(diagnostic.location().line()); - if (!diagnostic.fixIts().isEmpty() && !lineNumbersWithFixItMarker.contains(line)) { - const TextEditor::RefactorMarker marker - = createFixItAvailableMarker(m_textDocument->document(), line); + for (auto &&fixit : diagnostic.fixIts()) { + const ClangBackEnd::SourceLocationContainer location = fixit.range().start(); + const int line = int(location.line()); - lineNumbersWithFixItMarker.insert(line); - m_fixItAvailableMarkers.append(marker); + if (location.filePath() == filePath() && !lineNumbersWithFixItMarker.contains(line)) { + const TextEditor::RefactorMarker marker + = createFixItAvailableMarker(m_textDocument->document(), line); + + lineNumbersWithFixItMarker.insert(line); + m_fixItAvailableMarkers.append(marker); + } } addFixItAvailableMarker(diagnostic.children(), lineNumbersWithFixItMarker); diff --git a/src/plugins/clangcodemodel/clangfixitoperationsextractor.cpp b/src/plugins/clangcodemodel/clangfixitoperationsextractor.cpp index 08983d2dab2..7203e18dcb0 100644 --- a/src/plugins/clangcodemodel/clangfixitoperationsextractor.cpp +++ b/src/plugins/clangcodemodel/clangfixitoperationsextractor.cpp @@ -27,6 +27,8 @@ #include "clangfixitoperation.h" +#include + #include using ClangBackEnd::DiagnosticContainer; @@ -75,13 +77,16 @@ QString tweakedDiagnosticText(const QString &diagnosticText) return tweakedText; } -bool isDiagnosticFromFileAtLine(const DiagnosticContainer &diagnosticContainer, - const QString &filePath, - int line) +bool hasFixItAt(const QVector &fixits, + const Utf8String &filePath, + int line) { - const auto location = diagnosticContainer.location(); - return location.filePath().toString() == filePath - && location.line() == uint(line); + const auto isFixitForLocation = [filePath, line] (const ClangBackEnd::FixItContainer &fixit) { + const ClangBackEnd::SourceLocationContainer location = fixit.range().start(); + return location.filePath() == filePath && location.line() == uint(line); + }; + + return Utils::anyOf(fixits, isFixitForLocation); } } // anonymous namespace @@ -103,17 +108,17 @@ ClangFixItOperationsExtractor::extract(const QString &filePath, int line) return operations; } -void ClangFixItOperationsExtractor::appendFixitOperationsFromDiagnostic( +void ClangFixItOperationsExtractor::appendFixitOperation( const QString &filePath, - const DiagnosticContainer &diagnosticContainer) + const QString &diagnosticText, + const QVector &fixits) { - const auto fixIts = diagnosticContainer.fixIts(); - if (!fixIts.isEmpty()) { - const QString diagnosticText = tweakedDiagnosticText(diagnosticContainer.text().toString()); + if (!fixits.isEmpty()) { + const QString diagnosticTextTweaked = tweakedDiagnosticText(diagnosticText); TextEditor::QuickFixOperation::Ptr operation( new ClangFixItOperation(filePath, - diagnosticText, - fixIts)); + diagnosticTextTweaked, + fixits)); operations.append(operation); } } @@ -123,8 +128,9 @@ void ClangFixItOperationsExtractor::extractFromDiagnostic( const QString &filePath, int line) { - if (isDiagnosticFromFileAtLine(diagnosticContainer, filePath, line)) { - appendFixitOperationsFromDiagnostic(filePath, diagnosticContainer); + const QVector fixIts = diagnosticContainer.fixIts(); + if (hasFixItAt(fixIts, filePath, line)) { + appendFixitOperation(filePath, diagnosticContainer.text().toString(), fixIts); foreach (const auto &child, diagnosticContainer.children()) extractFromDiagnostic(child, filePath, line); diff --git a/src/plugins/clangcodemodel/clangfixitoperationsextractor.h b/src/plugins/clangcodemodel/clangfixitoperationsextractor.h index e504d27dea8..6c49a3da181 100644 --- a/src/plugins/clangcodemodel/clangfixitoperationsextractor.h +++ b/src/plugins/clangcodemodel/clangfixitoperationsextractor.h @@ -42,8 +42,9 @@ private: void extractFromDiagnostic(const ClangBackEnd::DiagnosticContainer &diagnosticContainer, const QString &filePath, int line); - void appendFixitOperationsFromDiagnostic(const QString &filePath, - const ClangBackEnd::DiagnosticContainer &diagnosticContainer); + void appendFixitOperation(const QString &filePath, + const QString &diagnosticText, + const QVector &fixits); private: const QVector &diagnosticContainers;