forked from qt-creator/qt-creator
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:
committed by
Nikolai Kosjar
parent
a645f78cd6
commit
7e544073c0
@@ -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();
|
||||||
|
@@ -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;
|
||||||
|
@@ -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> ¯oUses)
|
||||||
|
{
|
||||||
|
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> ¯oUses)
|
CheckSymbols::CheckSymbols(Document::Ptr doc, const LookupContext &context, const QList<CheckSymbols::Result> ¯oUses)
|
||||||
: 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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> ¯oUses);
|
const QList<Result> ¯oUses);
|
||||||
|
static CheckSymbols * create(CPlusPlus::Document::Ptr doc,
|
||||||
|
const CPlusPlus::LookupContext &context,
|
||||||
|
const QList<Result> ¯oUses);
|
||||||
|
|
||||||
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;
|
||||||
|
@@ -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(
|
||||||
|
Reference in New Issue
Block a user