From 40725cfd6db30ccb06239a3fb04de80f1e8d276e Mon Sep 17 00:00:00 2001
From: Christian Kamm <christian.d.kamm@nokia.com>
Date: Mon, 6 Dec 2010 13:10:09 +0100
Subject: [PATCH] C++: Bind Q_ENUMS in the code model.

Reviewed-by: Roberto Raggi
---
 src/shared/cplusplus/Bind.cpp                 |  8 +++++++-
 .../cplusplus/CPlusPlusForwardDeclarations.h  |  1 +
 src/shared/cplusplus/Control.cpp              | 10 ++++++++++
 src/shared/cplusplus/Control.h                |  3 +++
 src/shared/cplusplus/Symbol.h                 |  5 +++++
 src/shared/cplusplus/SymbolVisitor.h          |  1 +
 src/shared/cplusplus/Symbols.cpp              | 15 ++++++++++++++
 src/shared/cplusplus/Symbols.h                | 20 +++++++++++++++++++
 8 files changed, 62 insertions(+), 1 deletion(-)

diff --git a/src/shared/cplusplus/Bind.cpp b/src/shared/cplusplus/Bind.cpp
index a21f73df182..c561455ec64 100644
--- a/src/shared/cplusplus/Bind.cpp
+++ b/src/shared/cplusplus/Bind.cpp
@@ -1931,8 +1931,13 @@ bool Bind::visit(QtEnumDeclarationAST *ast)
     // unsigned enum_specifier_token = ast->enum_specifier_token;
     // unsigned lparen_token = ast->lparen_token;
     for (NameListAST *it = ast->enumerator_list; it; it = it->next) {
-        /*const Name *value =*/ this->name(it->value);
+        const Name *value = this->name(it->value);
+        if (!value)
+            continue;
+        QtEnum *qtEnum = control()->newQtEnum(it->value->firstToken(), value);
+        _scope->addMember(qtEnum);
     }
+
     // unsigned rparen_token = ast->rparen_token;
     return false;
 }
@@ -2833,6 +2838,7 @@ bool Bind::visit(EnumSpecifierAST *ast)
 {
     unsigned sourceLocation = location(ast->name, ast->firstToken());
     const Name *enumName = this->name(ast->name);
+
     Enum *e = control()->newEnum(sourceLocation, enumName);
     e->setStartOffset(tokenAt(sourceLocation).end()); // at the end of the enum or identifier token.
     e->setEndOffset(tokenAt(ast->lastToken() - 1).end());
diff --git a/src/shared/cplusplus/CPlusPlusForwardDeclarations.h b/src/shared/cplusplus/CPlusPlusForwardDeclarations.h
index c2c54c7e196..af52242ce7a 100644
--- a/src/shared/cplusplus/CPlusPlusForwardDeclarations.h
+++ b/src/shared/cplusplus/CPlusPlusForwardDeclarations.h
@@ -133,6 +133,7 @@ class Token;
 
 // Qt symbols
 class QtPropertyDeclaration;
+class QtEnum;
 
 // Objective-C symbols
 class ObjCBaseClass;
diff --git a/src/shared/cplusplus/Control.cpp b/src/shared/cplusplus/Control.cpp
index 9a6f5a61c1e..abfe4561fe8 100644
--- a/src/shared/cplusplus/Control.cpp
+++ b/src/shared/cplusplus/Control.cpp
@@ -410,6 +410,13 @@ public:
         return d;
     }
 
+    QtEnum *newQtEnum(unsigned sourceLocation, const Name *name)
+    {
+        QtEnum *d = new QtEnum(translationUnit, sourceLocation, name);
+        symbols.push_back(d);
+        return d;
+    }
+
     ObjCBaseClass *newObjCBaseClass(unsigned sourceLocation, const Name *name)
     {
         ObjCBaseClass *c = new ObjCBaseClass(translationUnit, sourceLocation, name);
@@ -720,6 +727,9 @@ QtPropertyDeclaration *Control::newQtPropertyDeclaration(unsigned sourceLocation
                                                          const Name *name)
 { return d->newQtPropertyDeclaration(sourceLocation, name); }
 
+QtEnum *Control::newQtEnum(unsigned sourceLocation, const Name *name)
+{ return d->newQtEnum(sourceLocation, name); }
+
 ObjCBaseClass *Control::newObjCBaseClass(unsigned sourceLocation, const Name *name)
 { return d->newObjCBaseClass(sourceLocation, name); }
 
diff --git a/src/shared/cplusplus/Control.h b/src/shared/cplusplus/Control.h
index 0d3f613d075..3327544d496 100644
--- a/src/shared/cplusplus/Control.h
+++ b/src/shared/cplusplus/Control.h
@@ -161,6 +161,9 @@ public:
     /// Creates a new QtPropertyDeclaration symbol.
     QtPropertyDeclaration *newQtPropertyDeclaration(unsigned sourceLocation, const Name *name = 0);
 
+    /// Creates a new QtEnum symbol.
+    QtEnum *newQtEnum(unsigned sourceLocation, const Name *name = 0);
+
     ObjCBaseClass *newObjCBaseClass(unsigned sourceLocation, const Name *name);
     ObjCBaseProtocol *newObjCBaseProtocol(unsigned sourceLocation, const Name *name);
 
diff --git a/src/shared/cplusplus/Symbol.h b/src/shared/cplusplus/Symbol.h
index b5bb9ced286..6d3aa93b508 100644
--- a/src/shared/cplusplus/Symbol.h
+++ b/src/shared/cplusplus/Symbol.h
@@ -205,6 +205,9 @@ public:
     /// Returns true if this Symbol is a QtPropertyDeclaration.
     bool isQtPropertyDeclaration() const;
 
+    /// Returns true if this Symbol is a QtEnum.
+    bool isQtEnum() const;
+
     bool isObjCBaseClass() const;
     bool isObjCBaseProtocol() const;
 
@@ -242,6 +245,7 @@ public:
     virtual const BaseClass *asBaseClass() const { return 0; }
     virtual const ForwardClassDeclaration *asForwardClassDeclaration() const { return 0; }
     virtual const QtPropertyDeclaration *asQtPropertyDeclaration() const { return 0; }
+    virtual const QtEnum *asQtEnum() const { return 0; }
     virtual const ObjCBaseClass *asObjCBaseClass() const { return 0; }
     virtual const ObjCBaseProtocol *asObjCBaseProtocol() const { return 0; }
     virtual const ObjCClass *asObjCClass() const { return 0; }
@@ -267,6 +271,7 @@ public:
     virtual BaseClass *asBaseClass() { return 0; }
     virtual ForwardClassDeclaration *asForwardClassDeclaration() { return 0; }
     virtual QtPropertyDeclaration *asQtPropertyDeclaration() { return 0; }
+    virtual QtEnum *asQtEnum() { return 0; }
     virtual ObjCBaseClass *asObjCBaseClass() { return 0; }
     virtual ObjCBaseProtocol *asObjCBaseProtocol() { return 0; }
     virtual ObjCClass *asObjCClass() { return 0; }
diff --git a/src/shared/cplusplus/SymbolVisitor.h b/src/shared/cplusplus/SymbolVisitor.h
index 85959911a36..874315eb0f8 100644
--- a/src/shared/cplusplus/SymbolVisitor.h
+++ b/src/shared/cplusplus/SymbolVisitor.h
@@ -89,6 +89,7 @@ public:
 
     // Qt
     virtual bool visit(QtPropertyDeclaration *) { return true; }
+    virtual bool visit(QtEnum *) { return true; }
 
     // Objective-C
     virtual bool visit(ObjCBaseClass *) { return true; }
diff --git a/src/shared/cplusplus/Symbols.cpp b/src/shared/cplusplus/Symbols.cpp
index 128c1d258f6..c820e39022f 100644
--- a/src/shared/cplusplus/Symbols.cpp
+++ b/src/shared/cplusplus/Symbols.cpp
@@ -687,6 +687,7 @@ void Class::visitSymbol0(SymbolVisitor *visitor)
 
 QtPropertyDeclaration::QtPropertyDeclaration(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name)
     : Symbol(translationUnit, sourceLocation, name)
+    , _flags(NoFlags)
 { }
 
 QtPropertyDeclaration::~QtPropertyDeclaration()
@@ -708,6 +709,20 @@ void QtPropertyDeclaration::visitSymbol0(SymbolVisitor *visitor)
 { visitor->visit(this); }
 
 
+QtEnum::QtEnum(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name)
+    : Symbol(translationUnit, sourceLocation, name)
+{ }
+
+QtEnum::~QtEnum()
+{ }
+
+FullySpecifiedType QtEnum::type() const
+{ return FullySpecifiedType(); }
+
+void QtEnum::visitSymbol0(SymbolVisitor *visitor)
+{ visitor->visit(this); }
+
+
 ObjCBaseClass::ObjCBaseClass(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name)
     : Symbol(translationUnit, sourceLocation, name)
 { }
diff --git a/src/shared/cplusplus/Symbols.h b/src/shared/cplusplus/Symbols.h
index 7de9b2249e4..e4def13bce8 100644
--- a/src/shared/cplusplus/Symbols.h
+++ b/src/shared/cplusplus/Symbols.h
@@ -524,6 +524,7 @@ class CPLUSPLUS_EXPORT QtPropertyDeclaration: public Symbol
 {
 public:
     enum Flag {
+        NoFlags = 0,
         ReadFunction = 1 << 0,
         WriteFunction = 1 << 1,
         ResetFunction = 1 << 2,
@@ -566,6 +567,25 @@ private:
     int _flags;
 };
 
+class CPLUSPLUS_EXPORT QtEnum: public Symbol
+{
+public:
+    QtEnum(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name);
+    virtual ~QtEnum();
+
+    // Symbol's interface
+    virtual FullySpecifiedType type() const;
+
+    virtual const QtEnum *asQtEnum() const
+    { return this; }
+
+    virtual QtEnum *asQtEnum()
+    { return this; }
+
+protected:
+    virtual void visitSymbol0(SymbolVisitor *visitor);
+};
+
 class CPLUSPLUS_EXPORT ObjCBaseClass: public Symbol
 {
 public:
-- 
GitLab