summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus
diff options
context:
space:
mode:
authorChristian Kamm <christian.d.kamm@nokia.com>2010-12-06 13:10:09 +0100
committerChristian Kamm <christian.d.kamm@nokia.com>2011-01-04 15:58:22 +0100
commit40725cfd6db30ccb06239a3fb04de80f1e8d276e (patch)
tree5f5ff5d80725dd53884f29c816871b8f4ee36e58 /src/shared/cplusplus
parent0edd253b615b485913d2bbb504a146f6aaa89c04 (diff)
downloadqt-creator-40725cfd6db30ccb06239a3fb04de80f1e8d276e.tar.gz
C++: Bind Q_ENUMS in the code model.
Reviewed-by: Roberto Raggi
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r--src/shared/cplusplus/Bind.cpp8
-rw-r--r--src/shared/cplusplus/CPlusPlusForwardDeclarations.h1
-rw-r--r--src/shared/cplusplus/Control.cpp10
-rw-r--r--src/shared/cplusplus/Control.h3
-rw-r--r--src/shared/cplusplus/Symbol.h5
-rw-r--r--src/shared/cplusplus/SymbolVisitor.h1
-rw-r--r--src/shared/cplusplus/Symbols.cpp15
-rw-r--r--src/shared/cplusplus/Symbols.h20
8 files changed, 62 insertions, 1 deletions
diff --git a/src/shared/cplusplus/Bind.cpp b/src/shared/cplusplus/Bind.cpp
index a21f73df18..c561455ec6 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 c2c54c7e19..af52242ce7 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 9a6f5a61c1..abfe4561fe 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 0d3f613d07..3327544d49 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 b5bb9ced28..6d3aa93b50 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 85959911a3..874315eb0f 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 128c1d258f..c820e39022 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 7de9b2249e..e4def13bce 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: