From cb9cc8dca6c26a2058f9c7058806221733b91ff9 Mon Sep 17 00:00:00 2001 From: Leandro Melo Date: Fri, 4 Feb 2011 16:26:10 +0100 Subject: [PATCH] C++ editor: Better control to stop the semantic highlighter Done-by: Roberto Raggi Reviewed-by: Leandro Melo Reviewed-by: mae --- src/plugins/cppeditor/cppeditor.cpp | 1 + src/plugins/cppeditor/cppeditor.h | 4 +++- src/shared/cplusplus/Control.cpp | 12 ++++++++++++ src/shared/cplusplus/Control.h | 11 +++++++++++ src/shared/cplusplus/Parser.cpp | 7 +++++++ 5 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp index 532303e5a9..ed9fc8ebee 100644 --- a/src/plugins/cppeditor/cppeditor.cpp +++ b/src/plugins/cppeditor/cppeditor.cpp @@ -2182,6 +2182,7 @@ SemanticInfo SemanticHighlighter::semanticInfo(const Source &source) const QByteArray preprocessedCode = snapshot.preprocessedCode(source.code, source.fileName); doc = snapshot.documentFromSource(preprocessedCode, source.fileName); + doc->control()->setTopLevelDeclarationProcessor(this); doc->check(); #if 0 diff --git a/src/plugins/cppeditor/cppeditor.h b/src/plugins/cppeditor/cppeditor.h index 6f6ab170e9..d8fd7a6c61 100644 --- a/src/plugins/cppeditor/cppeditor.h +++ b/src/plugins/cppeditor/cppeditor.h @@ -73,7 +73,7 @@ namespace Internal { class CPPEditor; -class SemanticHighlighter: public QThread +class SemanticHighlighter: public QThread, CPlusPlus::TopLevelDeclarationProcessor { Q_OBJECT @@ -81,6 +81,8 @@ public: SemanticHighlighter(QObject *parent = 0); virtual ~SemanticHighlighter(); + virtual bool processDeclaration(CPlusPlus::DeclarationAST *) { return m_done; } + void abort(); struct Source diff --git a/src/shared/cplusplus/Control.cpp b/src/shared/cplusplus/Control.cpp index bb6e7fa86d..85441bf221 100644 --- a/src/shared/cplusplus/Control.cpp +++ b/src/shared/cplusplus/Control.cpp @@ -244,6 +244,7 @@ public: , objcRetainId(0) , objcCopyId(0) , objcNonatomicId(0) + , processor(0) {} ~Data() @@ -531,6 +532,7 @@ public: const Identifier *objcRetainId; const Identifier *objcCopyId; const Identifier *objcNonatomicId; + TopLevelDeclarationProcessor *processor; }; Control::Control() @@ -809,3 +811,13 @@ void Control::squeeze() { d->numericLiterals.reset(); } + +TopLevelDeclarationProcessor *Control::topLevelDeclarationProcessor() const +{ + return d->processor; +} + +void Control::setTopLevelDeclarationProcessor(CPlusPlus::TopLevelDeclarationProcessor *processor) +{ + d->processor = processor; +} diff --git a/src/shared/cplusplus/Control.h b/src/shared/cplusplus/Control.h index 43c4ea1a1e..ce87685c8f 100644 --- a/src/shared/cplusplus/Control.h +++ b/src/shared/cplusplus/Control.h @@ -54,10 +54,18 @@ #define CPLUSPLUS_CONTROL_H #include "CPlusPlusForwardDeclarations.h" +#include "ASTfwd.h" #include "Names.h" namespace CPlusPlus { +class CPLUSPLUS_EXPORT TopLevelDeclarationProcessor +{ +public: + virtual ~TopLevelDeclarationProcessor() {} + virtual bool processDeclaration(DeclarationAST *ast) = 0; +}; + class CPLUSPLUS_EXPORT Control { public: @@ -67,6 +75,9 @@ public: TranslationUnit *translationUnit() const; TranslationUnit *switchTranslationUnit(TranslationUnit *unit); + TopLevelDeclarationProcessor *topLevelDeclarationProcessor() const; + void setTopLevelDeclarationProcessor(TopLevelDeclarationProcessor *processor); + DiagnosticClient *diagnosticClient() const; void setDiagnosticClient(DiagnosticClient *diagnosticClient); diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index 4fdf77188e..7b1cfe17c1 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -566,6 +566,12 @@ bool Parser::parseTranslationUnit(TranslationUnitAST *&node) skipUntilDeclaration(); } + + if (TopLevelDeclarationProcessor *processor = _control->topLevelDeclarationProcessor()) { + if (processor->processDeclaration(declaration)) + break; + } + _templateArgumentList.clear(); } @@ -6032,3 +6038,4 @@ void Parser::fatal(unsigned index, const char *format, ...) va_end(ap); va_end(args); } + -- 2.11.0