diff --git a/src/shared/cplusplus/Bind.cpp b/src/shared/cplusplus/Bind.cpp index a21f73df182d9ac2ff1b8fc6222f5f2e2facb1e3..c561455ec6475b93a3208d8f4bc3f6d3376d23ca 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 c2c54c7e19608cf4d5f19588f2aa75f98ab486c2..af52242ce7ad404e6749fe746f1576e7a5466391 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 9a6f5a61c1e2e07564fa7310556a9d9d3fdf241e..abfe4561fe8d0145d73e22a721c2bda085933838 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 0d3f613d075424a93722fae314335c996c9f9730..3327544d496817ebc3cdcf4ce66e27266f062216 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 b5bb9ced2867f5e6b2c9034b6cc8d069f1345aec..6d3aa93b508807a5c7e6c283bd7970ef5078adcb 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 85959911a36cd3ee3c65ed2a699c2dc6202654b3..874315eb0f8d42d9efe544801f8d6485d89d01f1 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 128c1d258f6e948e6b58e1583b6ce56cfb163b18..c820e39022f83ceb6967e54d28ecaaa681961cbe 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 7de9b2249e44170befebcefa1a4f9669f8215415..e4def13bce8b16c745a7215e336a506bb602c2b2 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: