OSDN Git Service

C++ editor: Better control to stop the semantic highlighter
authorLeandro Melo <leandro.melo@nokia.com>
Fri, 4 Feb 2011 15:26:10 +0000 (16:26 +0100)
committerLeandro Melo <leandro.melo@nokia.com>
Fri, 4 Feb 2011 16:04:56 +0000 (17:04 +0100)
Done-by: Roberto Raggi
Reviewed-by: Leandro Melo
Reviewed-by: mae
src/plugins/cppeditor/cppeditor.cpp
src/plugins/cppeditor/cppeditor.h
src/shared/cplusplus/Control.cpp
src/shared/cplusplus/Control.h
src/shared/cplusplus/Parser.cpp

index 532303e..ed9fc8e 100644 (file)
@@ -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
index 6f6ab17..d8fd7a6 100644 (file)
@@ -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
index bb6e7fa..85441bf 100644 (file)
@@ -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;
+}
index 43c4ea1..ce87685 100644 (file)
 #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);
 
index 4fdf771..7b1cfe1 100644 (file)
@@ -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);
 }
+