summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2010-08-13 12:24:29 +0200
committerRoberto Raggi <roberto.raggi@nokia.com>2010-08-13 12:24:29 +0200
commit84920f53b83adbfa9811a7c293387c26829d4481 (patch)
treed682bda14dbe197787d672ec450b59877aae09c8 /src/shared/cplusplus
parentbcd2350fa9c6e836dc2d3a1b2eb784741e66deb8 (diff)
downloadqt-creator-84920f53b83adbfa9811a7c293387c26829d4481.tar.gz
Update the member's visibility.
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r--src/shared/cplusplus/Bind.cpp30
1 files changed, 29 insertions, 1 deletions
diff --git a/src/shared/cplusplus/Bind.cpp b/src/shared/cplusplus/Bind.cpp
index cbb492f32b..2ad1c6fbda 100644
--- a/src/shared/cplusplus/Bind.cpp
+++ b/src/shared/cplusplus/Bind.cpp
@@ -2380,10 +2380,22 @@ bool Bind::visit(ClassSpecifierAST *ast)
klass->setEndOffset(tokenAt(ast->lastToken() - 1).end());
_scope->addMember(klass);
+ if (_scope->isClass())
+ klass->setVisibility(_visibility);
+
+ // set the class key
+ unsigned classKey = tokenKind(ast->classkey_token);
+ if (classKey == T_CLASS)
+ klass->setClassKey(Class::ClassKey);
+ else if (classKey == T_STRUCT)
+ klass->setClassKey(Class::StructKey);
+ else if (classKey == T_UNION)
+ klass->setClassKey(Class::UnionKey);
+
_type.setType(klass);
Scope *previousScope = switchScope(klass);
- const int previousVisibility = switchVisibility(Symbol::Public);
+ const int previousVisibility = switchVisibility(visibilityForClassKey(classKey));
const int previousMethodKey = switchMethodKey(Function::NormalMethod);
for (BaseSpecifierListAST *it = ast->base_clause_list; it; it = it->next) {
@@ -2431,6 +2443,9 @@ bool Bind::visit(EnumSpecifierAST *ast)
ast->symbol = e;
_scope->addMember(e);
+ if (_scope->isClass())
+ e->setVisibility(_visibility);
+
Scope *previousScope = switchScope(e);
for (EnumeratorListAST *it = ast->enumerator_list; it; it = it->next) {
this->enumerator(it->value, e);
@@ -2594,3 +2609,16 @@ int Bind::visibilityForAccessSpecifier(int tokenKind)
return Symbol::Public;
}
}
+
+int Bind::visibilityForClassKey(int tokenKind)
+{
+ switch (tokenKind) {
+ case T_CLASS:
+ return Symbol::Private;
+ case T_STRUCT:
+ case T_UNION:
+ return Symbol::Public;
+ default:
+ return Symbol::Public;
+ }
+}