From 5d7def6d2ad8be72f4b6e1255a779209dbe90ff8 Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Tue, 17 Nov 2009 13:28:20 +0100
Subject: [PATCH] Refactored the AST visitors.

Now, the ASTVisitor constructor takes a valid reference to a TranslationUnit.
---
 src/libs/cplusplus/ASTParent.cpp             |  4 ++--
 src/libs/cplusplus/ASTParent.h               |  2 +-
 src/libs/cplusplus/CheckUndefinedSymbols.cpp |  2 +-
 src/libs/cplusplus/CppDocument.cpp           |  2 +-
 src/libs/cplusplus/FindUsages.cpp            |  4 ++--
 src/libs/cplusplus/ResolveExpression.cpp     |  4 ++--
 src/plugins/cppeditor/cppeditor.cpp          | 18 +++++++++---------
 src/plugins/cppeditor/cppquickfix.cpp        |  4 +++-
 src/shared/cplusplus/ASTVisitor.cpp          | 16 ++++++++++++----
 src/shared/cplusplus/ASTVisitor.h            |  7 ++++---
 src/shared/cplusplus/Semantic.cpp            | 13 +++++++++----
 src/shared/cplusplus/Semantic.h              |  3 ++-
 src/shared/cplusplus/SemanticCheck.cpp       |  2 +-
 13 files changed, 49 insertions(+), 32 deletions(-)

diff --git a/src/libs/cplusplus/ASTParent.cpp b/src/libs/cplusplus/ASTParent.cpp
index e751d504f99..5e9d5f98b6f 100644
--- a/src/libs/cplusplus/ASTParent.cpp
+++ b/src/libs/cplusplus/ASTParent.cpp
@@ -32,8 +32,8 @@
 
 using namespace CPlusPlus;
 
-ASTParent::ASTParent(Control *control, AST *rootNode)
-    : ASTVisitor(control)
+ASTParent::ASTParent(TranslationUnit *translationUnit, AST *rootNode)
+    : ASTVisitor(translationUnit)
 {
     accept(rootNode);
 }
diff --git a/src/libs/cplusplus/ASTParent.h b/src/libs/cplusplus/ASTParent.h
index ec5ea563d0c..a934f9c80df 100644
--- a/src/libs/cplusplus/ASTParent.h
+++ b/src/libs/cplusplus/ASTParent.h
@@ -39,7 +39,7 @@ namespace CPlusPlus {
 class CPLUSPLUS_EXPORT ASTParent: protected ASTVisitor
 {
 public:
-    ASTParent(Control *control, AST *rootNode);
+    ASTParent(TranslationUnit *transaltionUnit, AST *rootNode);
     virtual ~ASTParent();
 
     AST *operator()(AST *ast) const;
diff --git a/src/libs/cplusplus/CheckUndefinedSymbols.cpp b/src/libs/cplusplus/CheckUndefinedSymbols.cpp
index 6010e4283ee..51d02a0dc47 100644
--- a/src/libs/cplusplus/CheckUndefinedSymbols.cpp
+++ b/src/libs/cplusplus/CheckUndefinedSymbols.cpp
@@ -41,7 +41,7 @@ using namespace CPlusPlus;
 
 
 CheckUndefinedSymbols::CheckUndefinedSymbols(Document::Ptr doc)
-    : ASTVisitor(doc->control()), _doc(doc)
+    : ASTVisitor(doc->translationUnit()), _doc(doc)
 { }
 
 CheckUndefinedSymbols::~CheckUndefinedSymbols()
diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp
index bd86eecaae1..24614c06e19 100644
--- a/src/libs/cplusplus/CppDocument.cpp
+++ b/src/libs/cplusplus/CppDocument.cpp
@@ -404,7 +404,7 @@ void Document::check(CheckMode mode)
     if (! isParsed())
         parse();
 
-    Semantic semantic(_control);
+    Semantic semantic(_translationUnit);
     if (mode == FastCheck)
         semantic.setSkipFunctionBodies(true);
 
diff --git a/src/libs/cplusplus/FindUsages.cpp b/src/libs/cplusplus/FindUsages.cpp
index 5914322404e..7374e034fb6 100644
--- a/src/libs/cplusplus/FindUsages.cpp
+++ b/src/libs/cplusplus/FindUsages.cpp
@@ -41,12 +41,12 @@
 using namespace CPlusPlus;
 
 FindUsages::FindUsages(Document::Ptr doc, const Snapshot &snapshot, QFutureInterface<Usage> *future)
-    : ASTVisitor(doc->control()),
+    : ASTVisitor(doc->translationUnit()),
       _future(future),
       _doc(doc),
       _snapshot(snapshot),
       _source(_doc->source()),
-      _sem(doc->control()),
+      _sem(doc->translationUnit()),
       _inSimpleDeclaration(0)
 {
     _snapshot.insert(_doc);
diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp
index ba6952e7bff..de26ea9c5d3 100644
--- a/src/libs/cplusplus/ResolveExpression.cpp
+++ b/src/libs/cplusplus/ResolveExpression.cpp
@@ -72,9 +72,9 @@ static QList<_Tp> removeDuplicates(const QList<_Tp> &results)
 // ResolveExpression
 /////////////////////////////////////////////////////////////////////
 ResolveExpression::ResolveExpression(const LookupContext &context)
-    : ASTVisitor(context.expressionDocument()->control()),
+    : ASTVisitor(context.expressionDocument()->translationUnit()),
       _context(context),
-      sem(_context.control())
+      sem(context.expressionDocument()->translationUnit())
 { }
 
 ResolveExpression::~ResolveExpression()
diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp
index b9af8ad076b..59d06a90392 100644
--- a/src/plugins/cppeditor/cppeditor.cpp
+++ b/src/plugins/cppeditor/cppeditor.cpp
@@ -191,8 +191,8 @@ class FindUses: protected ASTVisitor
     FindScope findScope;
 
 public:
-    FindUses(Control *control)
-        : ASTVisitor(control)
+    FindUses(TranslationUnit *translationUnit)
+        : ASTVisitor(translationUnit)
     { }
 
     // local and external uses.
@@ -382,8 +382,8 @@ class FunctionDefinitionUnderCursor: protected ASTVisitor
     FunctionDefinitionAST *_functionDefinition;
 
 public:
-    FunctionDefinitionUnderCursor(Control *control)
-        : ASTVisitor(control),
+    FunctionDefinitionUnderCursor(TranslationUnit *translationUnit)
+        : ASTVisitor(translationUnit),
           _line(0), _column(0)
     { }
 
@@ -427,8 +427,9 @@ class ProcessDeclarators: protected ASTVisitor
     bool _visitFunctionDeclarator;
 
 public:
-    ProcessDeclarators(Control *control)
-            : ASTVisitor(control), _visitFunctionDeclarator(true)
+    ProcessDeclarators(TranslationUnit *translationUnit)
+        : ASTVisitor(translationUnit),
+          _visitFunctionDeclarator(true)
     { }
 
     QList<DeclaratorIdAST *> operator()(FunctionDefinitionAST *ast)
@@ -2030,14 +2031,13 @@ SemanticInfo SemanticHighlighter::semanticInfo(const Source &source)
         doc->check();
     }
 
-    Control *control = doc->control();
     TranslationUnit *translationUnit = doc->translationUnit();
     AST *ast = translationUnit->ast();
 
-    FunctionDefinitionUnderCursor functionDefinitionUnderCursor(control);
+    FunctionDefinitionUnderCursor functionDefinitionUnderCursor(translationUnit);
     FunctionDefinitionAST *currentFunctionDefinition = functionDefinitionUnderCursor(ast, source.line, source.column);
 
-    FindUses useTable(control);
+    FindUses useTable(translationUnit);
     useTable(currentFunctionDefinition);
 
     SemanticInfo semanticInfo;
diff --git a/src/plugins/cppeditor/cppquickfix.cpp b/src/plugins/cppeditor/cppquickfix.cpp
index db3a8142543..11e9c221aef 100644
--- a/src/plugins/cppeditor/cppquickfix.cpp
+++ b/src/plugins/cppeditor/cppquickfix.cpp
@@ -54,7 +54,9 @@ class ASTPath: public ASTVisitor
 
 public:
     ASTPath(Document::Ptr doc)
-        : ASTVisitor(doc->control()), _doc(doc), _line(0), _column(0) {}
+        : ASTVisitor(doc->translationUnit()),
+          _doc(doc), _line(0), _column(0)
+    {}
 
     QList<AST *> operator()(const QTextCursor &cursor)
     {
diff --git a/src/shared/cplusplus/ASTVisitor.cpp b/src/shared/cplusplus/ASTVisitor.cpp
index 6f331515a08..9281efdf2b9 100644
--- a/src/shared/cplusplus/ASTVisitor.cpp
+++ b/src/shared/cplusplus/ASTVisitor.cpp
@@ -53,8 +53,8 @@
 
 using namespace CPlusPlus;
 
-ASTVisitor::ASTVisitor(Control *control)
-    : _control(control)
+ASTVisitor::ASTVisitor(TranslationUnit *translationUnit)
+    : _translationUnit(translationUnit)
 { }
 
 ASTVisitor::~ASTVisitor()
@@ -64,10 +64,18 @@ void ASTVisitor::accept(AST *ast)
 { AST::accept(ast, this); }
 
 Control *ASTVisitor::control() const
-{ return _control; }
+{
+    if (_translationUnit)
+        return _translationUnit->control();
+
+    return 0;
+}
 
 TranslationUnit *ASTVisitor::translationUnit() const
-{ return _control->translationUnit(); }
+{ return _translationUnit; }
+
+void ASTVisitor::setTranslationUnit(TranslationUnit *translationUnit)
+{ _translationUnit = translationUnit; }
 
 unsigned ASTVisitor::tokenCount() const
 { return translationUnit()->tokenCount(); }
diff --git a/src/shared/cplusplus/ASTVisitor.h b/src/shared/cplusplus/ASTVisitor.h
index e1429fa2f6e..0a42b6f4d4e 100644
--- a/src/shared/cplusplus/ASTVisitor.h
+++ b/src/shared/cplusplus/ASTVisitor.h
@@ -61,12 +61,13 @@ class CPLUSPLUS_EXPORT ASTVisitor
     void operator =(const ASTVisitor &other);
 
 public:
-    ASTVisitor(Control *control);
+    ASTVisitor(TranslationUnit *unit);
     virtual ~ASTVisitor();
 
-    Control *control() const;
     TranslationUnit *translationUnit() const;
+    void setTranslationUnit(TranslationUnit *translationUnit);
 
+    Control *control() const;
     unsigned tokenCount() const;
     const Token &tokenAt(unsigned index) const;
     int tokenKind(unsigned index) const;
@@ -352,7 +353,7 @@ public:
     virtual void endVisit(ObjCSynchronizedStatementAST *) { }
 
 private:
-    Control *_control;
+    TranslationUnit *_translationUnit;
 };
 
 } // end of namespace CPlusPlus
diff --git a/src/shared/cplusplus/Semantic.cpp b/src/shared/cplusplus/Semantic.cpp
index 8baf10d4b09..23e2fa2c95f 100644
--- a/src/shared/cplusplus/Semantic.cpp
+++ b/src/shared/cplusplus/Semantic.cpp
@@ -64,9 +64,10 @@ using namespace CPlusPlus;
 class Semantic::Data
 {
 public:
-    Data(Semantic *semantic, Control *control)
+    Data(Semantic *semantic, TranslationUnit *translationUnit)
         : semantic(semantic),
-          control(control),
+          translationUnit(translationUnit),
+          control(translationUnit->control()),
           skipFunctionBodies(false),
           visibility(Symbol::Public),
           ojbcVisibility(Symbol::Protected),
@@ -90,6 +91,7 @@ public:
     }
 
     Semantic *semantic;
+    TranslationUnit *translationUnit;
     Control *control;
     bool skipFunctionBodies;
     int visibility;
@@ -103,9 +105,9 @@ public:
     CheckName *checkName;
 };
 
-Semantic::Semantic(Control *control)
+Semantic::Semantic(TranslationUnit *translationUnit)
 {
-    d = new Data(this, control);
+    d = new Data(this, translationUnit);
     d->checkSpecifier = new CheckSpecifier(this);
     d->checkDeclaration = new CheckDeclaration(this);
     d->checkDeclarator = new CheckDeclarator(this);
@@ -117,6 +119,9 @@ Semantic::Semantic(Control *control)
 Semantic::~Semantic()
 { delete d; }
 
+TranslationUnit *Semantic::translationUnit() const
+{ return d->translationUnit; }
+
 Control *Semantic::control() const
 { return d->control; }
 
diff --git a/src/shared/cplusplus/Semantic.h b/src/shared/cplusplus/Semantic.h
index 391872d8470..4a2ebfc2fbd 100644
--- a/src/shared/cplusplus/Semantic.h
+++ b/src/shared/cplusplus/Semantic.h
@@ -61,9 +61,10 @@ class CPLUSPLUS_EXPORT Semantic
     void operator =(const Semantic &other);
 
 public:
-    Semantic(Control *control);
+    Semantic(TranslationUnit *translationUnit);
     virtual ~Semantic();
 
+    TranslationUnit *translationUnit() const;    
     Control *control() const;
 
     FullySpecifiedType check(SpecifierListAST *specifier, Scope *scope);
diff --git a/src/shared/cplusplus/SemanticCheck.cpp b/src/shared/cplusplus/SemanticCheck.cpp
index 1feffd93aa5..b28c01636b4 100644
--- a/src/shared/cplusplus/SemanticCheck.cpp
+++ b/src/shared/cplusplus/SemanticCheck.cpp
@@ -52,7 +52,7 @@
 using namespace CPlusPlus;
 
 SemanticCheck::SemanticCheck(Semantic *semantic)
-    : ASTVisitor(semantic->control()),
+    : ASTVisitor(semantic->translationUnit()),
       _semantic(semantic)
 { }
 
-- 
GitLab