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>
This commit is contained in:
Francois Ferrand
2014-09-15 11:13:36 +02:00
committed by Nikolai Kosjar
parent a645f78cd6
commit 7e544073c0
5 changed files with 68 additions and 21 deletions

View File

@@ -50,15 +50,14 @@ enum { debug = 0 };
namespace { namespace {
QFuture<TextEditor::HighlightingResult> runHighlighter(const CPlusPlus::Document::Ptr &doc, CppTools::CheckSymbols * createHighlighter(const CPlusPlus::Document::Ptr &doc,
const CPlusPlus::Snapshot &snapshot, const CPlusPlus::Snapshot &snapshot,
QTextDocument *textDocument) QTextDocument *textDocument)
{ {
QFuture<TextEditor::HighlightingResult> failed; QTC_ASSERT(doc, return 0);
QTC_ASSERT(doc, return failed); QTC_ASSERT(doc->translationUnit(), return 0);
QTC_ASSERT(doc->translationUnit(), return failed); QTC_ASSERT(doc->translationUnit()->ast(), return 0);
QTC_ASSERT(doc->translationUnit()->ast(), return failed); QTC_ASSERT(textDocument, return 0);
QTC_ASSERT(textDocument, return failed);
using namespace CPlusPlus; using namespace CPlusPlus;
using namespace CppTools; using namespace CppTools;
@@ -106,7 +105,7 @@ QFuture<TextEditor::HighlightingResult> runHighlighter(const CPlusPlus::Document
} }
LookupContext context(doc, snapshot); LookupContext context(doc, snapshot);
return CheckSymbols::go(doc, context, macroUses); return CheckSymbols::create(doc, context, macroUses);
} }
QList<TextEditor::BlockRange> toTextEditorBlocks( QList<TextEditor::BlockRange> toTextEditorBlocks(
@@ -128,6 +127,7 @@ BuiltinEditorDocumentProcessor::BuiltinEditorDocumentProcessor(
bool enableSemanticHighlighter) bool enableSemanticHighlighter)
: BaseEditorDocumentProcessor(document) : BaseEditorDocumentProcessor(document)
, m_parser(document->filePath()) , m_parser(document->filePath())
, m_codeWarningsUpdated(false)
, m_semanticHighlighter(enableSemanticHighlighter , m_semanticHighlighter(enableSemanticHighlighter
? new CppTools::SemanticHighlighter(document) ? new CppTools::SemanticHighlighter(document)
: 0) : 0)
@@ -141,8 +141,12 @@ BuiltinEditorDocumentProcessor::BuiltinEditorDocumentProcessor(
m_semanticHighlighter->setHighlightingRunner( m_semanticHighlighter->setHighlightingRunner(
[this]() -> QFuture<TextEditor::HighlightingResult> { [this]() -> QFuture<TextEditor::HighlightingResult> {
const SemanticInfo semanticInfo = m_semanticInfoUpdater.semanticInfo(); const SemanticInfo semanticInfo = m_semanticInfoUpdater.semanticInfo();
return runHighlighter(semanticInfo.doc, semanticInfo.snapshot, CheckSymbols *checkSymbols = createHighlighter(semanticInfo.doc, semanticInfo.snapshot,
baseTextDocument()->document()); 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()); const auto ifdefoutBlocks = toTextEditorBlocks(document->skippedBlocks());
emit ifdefedOutBlocksUpdated(revision(), ifdefoutBlocks); emit ifdefedOutBlocksUpdated(revision(), ifdefoutBlocks);
// Emit code warnings // Store parser warnings
auto codeWarnings = toTextEditorSelections(document->diagnosticMessages(), textDocument()); m_codeWarnings = toTextEditorSelections(document->diagnosticMessages(), textDocument());
emit codeWarningsUpdated(revision(), codeWarnings); m_codeWarningsUpdated = false;
emit cppDocumentUpdated(document); emit cppDocumentUpdated(document);
@@ -231,6 +235,27 @@ void BuiltinEditorDocumentProcessor::onSemanticInfoUpdated(const SemanticInfo se
m_semanticHighlighter->run(); 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 SemanticInfo::Source BuiltinEditorDocumentProcessor::createSemanticInfoSource(bool force) const
{ {
const WorkingCopy workingCopy = CppTools::CppModelManager::instance()->workingCopy(); const WorkingCopy workingCopy = CppTools::CppModelManager::instance()->workingCopy();

View File

@@ -60,6 +60,8 @@ public:
private: private:
void onParserFinished(CPlusPlus::Document::Ptr document, CPlusPlus::Snapshot snapshot); void onParserFinished(CPlusPlus::Document::Ptr document, CPlusPlus::Snapshot snapshot);
void onSemanticInfoUpdated(const CppTools::SemanticInfo semanticInfo); void onSemanticInfoUpdated(const CppTools::SemanticInfo semanticInfo);
void onCodeWarningsUpdated(CPlusPlus::Document::Ptr document,
const QList<CPlusPlus::Document::DiagnosticMessage> &codeWarnings);
SemanticInfo::Source createSemanticInfoSource(bool force) const; SemanticInfo::Source createSemanticInfoSource(bool force) const;
@@ -68,6 +70,8 @@ private:
QFuture<void> m_parserFuture; QFuture<void> m_parserFuture;
CPlusPlus::Snapshot m_documentSnapshot; CPlusPlus::Snapshot m_documentSnapshot;
QList<QTextEdit::ExtraSelection> m_codeWarnings;
bool m_codeWarningsUpdated;
SemanticInfoUpdater m_semanticInfoUpdater; SemanticInfoUpdater m_semanticInfoUpdater;
QScopedPointer<SemanticHighlighter> m_semanticHighlighter; QScopedPointer<SemanticHighlighter> m_semanticHighlighter;

View File

@@ -305,6 +305,16 @@ CheckSymbols::Future CheckSymbols::go(Document::Ptr doc, const LookupContext &co
return (new CheckSymbols(doc, context, macroUses))->start(); 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) CheckSymbols::CheckSymbols(Document::Ptr doc, const LookupContext &context, const QList<CheckSymbols::Result> &macroUses)
: ASTVisitor(doc->translationUnit()), _doc(doc), _context(context) : ASTVisitor(doc->translationUnit()), _doc(doc), _context(context)
, _lineOfLastUsage(0), _macroUses(macroUses) , _lineOfLastUsage(0), _macroUses(macroUses)
@@ -335,10 +345,6 @@ void CheckSymbols::run()
_potentialStatics = collectTypes.statics(); _potentialStatics = collectTypes.statics();
Utils::sort(_macroUses, sortByLinePredicate); Utils::sort(_macroUses, sortByLinePredicate);
// TODO: Handle concurrent (write) access of diagnostic messages and ensure
// propagation to the editor widget
// _doc->clearDiagnosticMessages();
if (!isCanceled()) { if (!isCanceled()) {
if (_doc->translationUnit()) { if (_doc->translationUnit()) {
accept(_doc->translationUnit()->ast()); accept(_doc->translationUnit()->ast());
@@ -347,15 +353,15 @@ void CheckSymbols::run()
} }
} }
emit codeWarningsUpdated(_doc, _diagMsgs);
reportFinished(); reportFinished();
} }
bool CheckSymbols::warning(unsigned line, unsigned column, const QString &text, unsigned length) bool CheckSymbols::warning(unsigned line, unsigned column, const QString &text, unsigned length)
{ {
Document::DiagnosticMessage m(Document::DiagnosticMessage::Warning, _fileName, line, column, text, length); Document::DiagnosticMessage m(Document::DiagnosticMessage::Warning, _fileName, line, column, text, length);
// TODO: Handle concurrent (write) access of diagnostic messages and ensure _diagMsgs.append(m);
// propagation to the editor widget
// _doc->addDiagnosticMessage(m);
return false; return false;
} }

View File

@@ -44,10 +44,12 @@
namespace CppTools { namespace CppTools {
class CPPTOOLS_EXPORT CheckSymbols: class CPPTOOLS_EXPORT CheckSymbols:
public QObject,
protected CPlusPlus::ASTVisitor, protected CPlusPlus::ASTVisitor,
public QRunnable, public QRunnable,
public QFutureInterface<TextEditor::HighlightingResult> public QFutureInterface<TextEditor::HighlightingResult>
{ {
Q_OBJECT
public: public:
virtual ~CheckSymbols(); virtual ~CheckSymbols();
@@ -70,6 +72,9 @@ public:
static Future go(CPlusPlus::Document::Ptr doc, static Future go(CPlusPlus::Document::Ptr doc,
const CPlusPlus::LookupContext &context, const CPlusPlus::LookupContext &context,
const QList<Result> &macroUses); 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) static QMap<int, QVector<Result> > chunks(const QFuture<Result> &future, int from, int to)
{ {
@@ -87,6 +92,10 @@ public:
return chunks; return chunks;
} }
signals:
void codeWarningsUpdated(CPlusPlus::Document::Ptr document,
const QList<CPlusPlus::Document::DiagnosticMessage> selections);
protected: protected:
using ASTVisitor::visit; using ASTVisitor::visit;
using ASTVisitor::endVisit; using ASTVisitor::endVisit;
@@ -182,6 +191,7 @@ private:
QSet<QByteArray> _potentialStatics; QSet<QByteArray> _potentialStatics;
QList<CPlusPlus::AST *> _astStack; QList<CPlusPlus::AST *> _astStack;
QVector<Result> _usages; QVector<Result> _usages;
QList<CPlusPlus::Document::DiagnosticMessage> _diagMsgs;
int _chunkSize; int _chunkSize;
unsigned _lineOfLastUsage; unsigned _lineOfLastUsage;
QList<Result> _macroUses; QList<Result> _macroUses;

View File

@@ -307,6 +307,8 @@ CppModelManager::CppModelManager(QObject *parent)
this, SLOT(onCoreAboutToClose())); this, SLOT(onCoreAboutToClose()));
qRegisterMetaType<CPlusPlus::Document::Ptr>("CPlusPlus::Document::Ptr"); qRegisterMetaType<CPlusPlus::Document::Ptr>("CPlusPlus::Document::Ptr");
qRegisterMetaType<QList<CPlusPlus::Document::DiagnosticMessage>>(
"QList<CPlusPlus::Document::DiagnosticMessage>");
d->m_modelManagerSupportFallback.reset(new ModelManagerSupportInternal); d->m_modelManagerSupportFallback.reset(new ModelManagerSupportInternal);
CppToolsPlugin::instance()->codeModelSettings()->setDefaultId( CppToolsPlugin::instance()->codeModelSettings()->setDefaultId(