summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2010-08-13 14:47:12 +0200
committerRoberto Raggi <roberto.raggi@nokia.com>2010-08-13 14:47:12 +0200
commit962a9eb4da48e67a1b131ad1cbb57f224418e883 (patch)
treed969cf689c6da77cd191981d46fdfeab86c89d17 /src/shared/cplusplus
parent72c806ab34a8fa9a0f4b0509e7d8fc10d4f4408e (diff)
downloadqt-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.cpp37
-rw-r--r--src/shared/cplusplus/Bind.h3
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;
};