diff options
author | Roberto Raggi <roberto.raggi@nokia.com> | 2010-08-13 14:47:12 +0200 |
---|---|---|
committer | Roberto Raggi <roberto.raggi@nokia.com> | 2010-08-13 14:47:12 +0200 |
commit | 962a9eb4da48e67a1b131ad1cbb57f224418e883 (patch) | |
tree | d969cf689c6da77cd191981d46fdfeab86c89d17 /src/shared/cplusplus | |
parent | 72c806ab34a8fa9a0f4b0509e7d8fc10d4f4408e (diff) | |
download | qt-creator-962a9eb4da48e67a1b131ad1cbb57f224418e883.tar.gz |
More work on the objc class and declaration symbols.
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r-- | src/shared/cplusplus/Bind.cpp | 37 | ||||
-rw-r--r-- | src/shared/cplusplus/Bind.h | 3 |
2 files changed, 38 insertions, 2 deletions
diff --git a/src/shared/cplusplus/Bind.cpp b/src/shared/cplusplus/Bind.cpp index c83f45a60f..6522b69a82 100644 --- a/src/shared/cplusplus/Bind.cpp +++ b/src/shared/cplusplus/Bind.cpp @@ -69,6 +69,7 @@ Bind::Bind(TranslationUnit *unit) _name(0), _declaratorId(0), _visibility(Symbol::Public), + _objcVisibility(Symbol::Public), _methodKey(Function::NormalMethod), _skipFunctionBodies(false) { @@ -135,6 +136,12 @@ int Bind::switchVisibility(int visibility) return visibility; } +int Bind::switchObjCVisibility(int visibility) +{ + std::swap(_objcVisibility, visibility); + return visibility; +} + int Bind::switchMethodKey(int methodKey) { std::swap(_methodKey, methodKey); @@ -2113,10 +2120,17 @@ bool Bind::visit(ObjCClassDeclarationAST *ast) } this->objCProtocolRefs(ast->protocol_refs, klass); + + const int previousObjCVisibility = switchObjCVisibility(Function::Protected); + this->objCInstanceVariablesDeclaration(ast->inst_vars_decl, klass); + + (void) switchObjCVisibility(Function::Public); for (DeclarationListAST *it = ast->member_declaration_list; it; it = it->next) { this->declaration(it->value); } + + (void) switchObjCVisibility(previousObjCVisibility); (void) switchScope(previousScope); return false; } @@ -2175,18 +2189,21 @@ bool Bind::visit(ObjCProtocolDeclarationAST *ast) _scope->addMember(protocol); Scope *previousScope = switchScope(protocol); + const int previousObjCVisibility = switchObjCVisibility(Function::Public); + this->objCProtocolRefs(ast->protocol_refs, protocol); for (DeclarationListAST *it = ast->member_declaration_list; it; it = it->next) { this->declaration(it->value); } + + (void) switchObjCVisibility(previousObjCVisibility); (void) switchScope(previousScope); return false; } bool Bind::visit(ObjCVisibilityDeclarationAST *ast) { - (void) ast; - // unsigned visibility_token = ast->visibility_token; + _objcVisibility = visibilityForObjCAccessSpecifier(tokenKind(ast->visibility_token)); return false; } @@ -2798,3 +2815,19 @@ int Bind::visibilityForClassKey(int tokenKind) return Symbol::Public; } } + +int Bind::visibilityForObjCAccessSpecifier(int tokenKind) +{ + switch (tokenKind) { + case T_AT_PUBLIC: + return Symbol::Public; + case T_AT_PROTECTED: + return Symbol::Protected; + case T_AT_PRIVATE: + return Symbol::Private; + case T_AT_PACKAGE: + return Symbol::Package; + default: + return Symbol::Protected; + } +} diff --git a/src/shared/cplusplus/Bind.h b/src/shared/cplusplus/Bind.h index adb210afbb..a632da1f9f 100644 --- a/src/shared/cplusplus/Bind.h +++ b/src/shared/cplusplus/Bind.h @@ -71,6 +71,7 @@ protected: static int visibilityForAccessSpecifier(int tokenKind); static int visibilityForClassKey(int tokenKind); + static int visibilityForObjCAccessSpecifier(int tokenKind); void setDeclSpecifiers(Symbol *symbol, const FullySpecifiedType &declSpecifiers); @@ -90,6 +91,7 @@ protected: Scope *switchScope(Scope *scope); int switchVisibility(int visibility); int switchMethodKey(int methodKey); + int switchObjCVisibility(int visibility); unsigned calculateScopeStart(ObjCClassDeclarationAST *ast) const; unsigned calculateScopeStart(ObjCProtocolDeclarationAST *ast) const; @@ -291,6 +293,7 @@ private: FullySpecifiedType _type; DeclaratorIdAST **_declaratorId; int _visibility; + int _objcVisibility; int _methodKey; bool _skipFunctionBodies; }; |