summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancois Ferrand <thetypz@gmail.com>2014-09-15 11:13:36 +0200
committerNikolai Kosjar <nikolai.kosjar@theqtcompany.com>2014-10-23 13:39:02 +0200
commit7e544073c0cb2701e5ade0f579f4b6b80d6ec2ec (patch)
tree6478929bf17fec4f9b0423e5f781b301f9a78f20
parenta645f78cd69860b57efba4c0a528fec234367327 (diff)
downloadqt-creator-7e544073c0cb2701e5ade0f579f4b6b80d6ec2ec.tar.gz
CppTools: restore C++ diagnostics messages.
The messages were computed, but not added to the document. Change-Id: Ibeea802cf9f291ad14b2fe2e9d2a285c927a4449 Reviewed-by: Nikolai Kosjar <nikolai.kosjar@theqtcompany.com>
-rw-r--r--src/plugins/cpptools/builtineditordocumentprocessor.cpp53
-rw-r--r--src/plugins/cpptools/builtineditordocumentprocessor.h4
-rw-r--r--src/plugins/cpptools/cppchecksymbols.cpp20
-rw-r--r--src/plugins/cpptools/cppchecksymbols.h10
-rw-r--r--src/plugins/cpptools/cppmodelmanager.cpp2
5 files changed, 68 insertions, 21 deletions
diff --git a/src/plugins/cpptools/builtineditordocumentprocessor.cpp b/src/plugins/cpptools/builtineditordocumentprocessor.cpp
index 4d8968e304..0474ed45e6 100644
--- a/src/plugins/cpptools/builtineditordocumentprocessor.cpp
+++ b/src/plugins/cpptools/builtineditordocumentprocessor.cpp
@@ -50,15 +50,14 @@ enum { debug = 0 };
namespace {
-QFuture<TextEditor::HighlightingResult> runHighlighter(const CPlusPlus::Document::Ptr &doc,
- const CPlusPlus::Snapshot &snapshot,
- QTextDocument *textDocument)
+CppTools::CheckSymbols * createHighlighter(const CPlusPlus::Document::Ptr &doc,
+ const CPlusPlus::Snapshot &snapshot,
+ QTextDocument *textDocument)
{
- QFuture<TextEditor::HighlightingResult> failed;
- QTC_ASSERT(doc, return failed);
- QTC_ASSERT(doc->translationUnit(), return failed);
- QTC_ASSERT(doc->translationUnit()->ast(), return failed);
- QTC_ASSERT(textDocument, return failed);
+ QTC_ASSERT(doc, return 0);
+ QTC_ASSERT(doc->translationUnit(), return 0);
+ QTC_ASSERT(doc->translationUnit()->ast(), return 0);
+ QTC_ASSERT(textDocument, return 0);
using namespace CPlusPlus;
using namespace CppTools;
@@ -106,7 +105,7 @@ QFuture<TextEditor::HighlightingResult> runHighlighter(const CPlusPlus::Document
}
LookupContext context(doc, snapshot);
- return CheckSymbols::go(doc, context, macroUses);
+ return CheckSymbols::create(doc, context, macroUses);
}
QList<TextEditor::BlockRange> toTextEditorBlocks(
@@ -128,6 +127,7 @@ BuiltinEditorDocumentProcessor::BuiltinEditorDocumentProcessor(
bool enableSemanticHighlighter)
: BaseEditorDocumentProcessor(document)
, m_parser(document->filePath())
+ , m_codeWarningsUpdated(false)
, m_semanticHighlighter(enableSemanticHighlighter
? new CppTools::SemanticHighlighter(document)
: 0)
@@ -141,8 +141,12 @@ BuiltinEditorDocumentProcessor::BuiltinEditorDocumentProcessor(
m_semanticHighlighter->setHighlightingRunner(
[this]() -> QFuture<TextEditor::HighlightingResult> {
const SemanticInfo semanticInfo = m_semanticInfoUpdater.semanticInfo();
- return runHighlighter(semanticInfo.doc, semanticInfo.snapshot,
- baseTextDocument()->document());
+ CheckSymbols *checkSymbols = createHighlighter(semanticInfo.doc, semanticInfo.snapshot,
+ baseTextDocument()->document());
+ QTC_ASSERT(checkSymbols, return QFuture<TextEditor::HighlightingResult>());
+ connect(checkSymbols, &CheckSymbols::codeWarningsUpdated,
+ this, &BuiltinEditorDocumentProcessor::onCodeWarningsUpdated);
+ return checkSymbols->start();
});
}
@@ -206,9 +210,9 @@ void BuiltinEditorDocumentProcessor::onParserFinished(CPlusPlus::Document::Ptr d
const auto ifdefoutBlocks = toTextEditorBlocks(document->skippedBlocks());
emit ifdefedOutBlocksUpdated(revision(), ifdefoutBlocks);
- // Emit code warnings
- auto codeWarnings = toTextEditorSelections(document->diagnosticMessages(), textDocument());
- emit codeWarningsUpdated(revision(), codeWarnings);
+ // Store parser warnings
+ m_codeWarnings = toTextEditorSelections(document->diagnosticMessages(), textDocument());
+ m_codeWarningsUpdated = false;
emit cppDocumentUpdated(document);
@@ -231,6 +235,27 @@ void BuiltinEditorDocumentProcessor::onSemanticInfoUpdated(const SemanticInfo se
m_semanticHighlighter->run();
}
+void BuiltinEditorDocumentProcessor::onCodeWarningsUpdated(
+ CPlusPlus::Document::Ptr document,
+ const QList<CPlusPlus::Document::DiagnosticMessage> &codeWarnings)
+{
+ if (document.isNull())
+ return;
+
+ if (document->fileName() != filePath())
+ return; // some other document got updated
+
+ if (document->editorRevision() != revision())
+ return; // outdated content, wait for a new document to be parsed
+
+ if (m_codeWarningsUpdated)
+ return; // code warnings already updated
+
+ m_codeWarnings += toTextEditorSelections(codeWarnings, textDocument());
+ m_codeWarningsUpdated = true;
+ emit codeWarningsUpdated(revision(), m_codeWarnings);
+}
+
SemanticInfo::Source BuiltinEditorDocumentProcessor::createSemanticInfoSource(bool force) const
{
const WorkingCopy workingCopy = CppTools::CppModelManager::instance()->workingCopy();
diff --git a/src/plugins/cpptools/builtineditordocumentprocessor.h b/src/plugins/cpptools/builtineditordocumentprocessor.h
index 2ff6c22841..a090118120 100644
--- a/src/plugins/cpptools/builtineditordocumentprocessor.h
+++ b/src/plugins/cpptools/builtineditordocumentprocessor.h
@@ -60,6 +60,8 @@ public:
private:
void onParserFinished(CPlusPlus::Document::Ptr document, CPlusPlus::Snapshot snapshot);
void onSemanticInfoUpdated(const CppTools::SemanticInfo semanticInfo);
+ void onCodeWarningsUpdated(CPlusPlus::Document::Ptr document,
+ const QList<CPlusPlus::Document::DiagnosticMessage> &codeWarnings);
SemanticInfo::Source createSemanticInfoSource(bool force) const;
@@ -68,6 +70,8 @@ private:
QFuture<void> m_parserFuture;
CPlusPlus::Snapshot m_documentSnapshot;
+ QList<QTextEdit::ExtraSelection> m_codeWarnings;
+ bool m_codeWarningsUpdated;
SemanticInfoUpdater m_semanticInfoUpdater;
QScopedPointer<SemanticHighlighter> m_semanticHighlighter;
diff --git a/src/plugins/cpptools/cppchecksymbols.cpp b/src/plugins/cpptools/cppchecksymbols.cpp
index 45a4f3d8a1..90ad1c1565 100644
--- a/src/plugins/cpptools/cppchecksymbols.cpp
+++ b/src/plugins/cpptools/cppchecksymbols.cpp
@@ -305,6 +305,16 @@ CheckSymbols::Future CheckSymbols::go(Document::Ptr doc, const LookupContext &co
return (new CheckSymbols(doc, context, macroUses))->start();
}
+CheckSymbols * CheckSymbols::create(Document::Ptr doc, const LookupContext &context,
+ const QList<CheckSymbols::Result> &macroUses)
+{
+ QTC_ASSERT(doc, return NULL);
+ QTC_ASSERT(doc->translationUnit(), return NULL);
+ QTC_ASSERT(doc->translationUnit()->ast(), return NULL);
+
+ return new CheckSymbols(doc, context, macroUses);
+}
+
CheckSymbols::CheckSymbols(Document::Ptr doc, const LookupContext &context, const QList<CheckSymbols::Result> &macroUses)
: ASTVisitor(doc->translationUnit()), _doc(doc), _context(context)
, _lineOfLastUsage(0), _macroUses(macroUses)
@@ -335,10 +345,6 @@ void CheckSymbols::run()
_potentialStatics = collectTypes.statics();
Utils::sort(_macroUses, sortByLinePredicate);
- // TODO: Handle concurrent (write) access of diagnostic messages and ensure
- // propagation to the editor widget
-// _doc->clearDiagnosticMessages();
-
if (!isCanceled()) {
if (_doc->translationUnit()) {
accept(_doc->translationUnit()->ast());
@@ -347,15 +353,15 @@ void CheckSymbols::run()
}
}
+ emit codeWarningsUpdated(_doc, _diagMsgs);
+
reportFinished();
}
bool CheckSymbols::warning(unsigned line, unsigned column, const QString &text, unsigned length)
{
Document::DiagnosticMessage m(Document::DiagnosticMessage::Warning, _fileName, line, column, text, length);
- // TODO: Handle concurrent (write) access of diagnostic messages and ensure
- // propagation to the editor widget
-// _doc->addDiagnosticMessage(m);
+ _diagMsgs.append(m);
return false;
}
diff --git a/src/plugins/cpptools/cppchecksymbols.h b/src/plugins/cpptools/cppchecksymbols.h
index 0700e94bfd..92566b3615 100644
--- a/src/plugins/cpptools/cppchecksymbols.h
+++ b/src/plugins/cpptools/cppchecksymbols.h
@@ -44,10 +44,12 @@
namespace CppTools {
class CPPTOOLS_EXPORT CheckSymbols:
+ public QObject,
protected CPlusPlus::ASTVisitor,
public QRunnable,
public QFutureInterface<TextEditor::HighlightingResult>
{
+ Q_OBJECT
public:
virtual ~CheckSymbols();
@@ -70,6 +72,9 @@ public:
static Future go(CPlusPlus::Document::Ptr doc,
const CPlusPlus::LookupContext &context,
const QList<Result> &macroUses);
+ static CheckSymbols * create(CPlusPlus::Document::Ptr doc,
+ const CPlusPlus::LookupContext &context,
+ const QList<Result> &macroUses);
static QMap<int, QVector<Result> > chunks(const QFuture<Result> &future, int from, int to)
{
@@ -87,6 +92,10 @@ public:
return chunks;
}
+signals:
+ void codeWarningsUpdated(CPlusPlus::Document::Ptr document,
+ const QList<CPlusPlus::Document::DiagnosticMessage> selections);
+
protected:
using ASTVisitor::visit;
using ASTVisitor::endVisit;
@@ -182,6 +191,7 @@ private:
QSet<QByteArray> _potentialStatics;
QList<CPlusPlus::AST *> _astStack;
QVector<Result> _usages;
+ QList<CPlusPlus::Document::DiagnosticMessage> _diagMsgs;
int _chunkSize;
unsigned _lineOfLastUsage;
QList<Result> _macroUses;
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index 1980bf8258..a07bf91238 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -307,6 +307,8 @@ CppModelManager::CppModelManager(QObject *parent)
this, SLOT(onCoreAboutToClose()));
qRegisterMetaType<CPlusPlus::Document::Ptr>("CPlusPlus::Document::Ptr");
+ qRegisterMetaType<QList<CPlusPlus::Document::DiagnosticMessage>>(
+ "QList<CPlusPlus::Document::DiagnosticMessage>");
d->m_modelManagerSupportFallback.reset(new ModelManagerSupportInternal);
CppToolsPlugin::instance()->codeModelSettings()->setDefaultId(