summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2010-08-13 10:30:33 +0200
committerRoberto Raggi <roberto.raggi@nokia.com>2010-08-13 10:30:33 +0200
commitabadf320705faf974c689f23cf11ed38730dfb3b (patch)
tree5f9d7ef3e80ebdc801a615058768d69170505206 /src/shared/cplusplus
parent849a52aead074fd7c91e0a33a3abc5031df3b2d9 (diff)
downloadqt-creator-abadf320705faf974c689f23cf11ed38730dfb3b.tar.gz
Handle symbol visibility.
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r--src/shared/cplusplus/Bind.cpp39
-rw-r--r--src/shared/cplusplus/Bind.h5
2 files changed, 36 insertions, 8 deletions
diff --git a/src/shared/cplusplus/Bind.cpp b/src/shared/cplusplus/Bind.cpp
index 8de3b779cb..e24f93d419 100644
--- a/src/shared/cplusplus/Bind.cpp
+++ b/src/shared/cplusplus/Bind.cpp
@@ -66,20 +66,28 @@ Bind::Bind(TranslationUnit *unit)
_scope(0),
_expression(0),
_name(0),
- _declaratorId(0)
+ _declaratorId(0),
+ _visibility(Symbol::Public),
+ _methodKey(Function::NormalMethod)
{
}
-Scope *Bind::currentScope() const
+Scope *Bind::switchScope(Scope *scope)
{
- return _scope;
+ std::swap(_scope, scope);
+ return scope;
}
-Scope *Bind::switchScope(Scope *scope)
+int Bind::switchVisibility(int visibility)
+{
+ std::swap(_visibility, visibility);
+ return visibility;
+}
+
+int Bind::switchMethodKey(int methodKey)
{
- Scope *previousScope = _scope;
- _scope = scope;
- return previousScope;
+ std::swap(_methodKey, methodKey);
+ return methodKey;
}
void Bind::operator()(TranslationUnitAST *ast, Namespace *globalNamespace)
@@ -1502,6 +1510,17 @@ bool Bind::visit(AccessDeclarationAST *ast)
// unsigned access_specifier_token = ast->access_specifier_token;
// unsigned slots_token = ast->slots_token;
// unsigned colon_token = ast->colon_token;
+
+ const int accessSpecifier = tokenKind(ast->access_specifier_token);
+ _visibility = visibilityForAccessSpecifier(accessSpecifier);
+
+ if (ast->slots_token)
+ _methodKey = Function::SlotMethod;
+ else if (accessSpecifier == T_Q_SIGNALS)
+ _methodKey = Function::SignalMethod;
+ else
+ _methodKey = Function::NormalMethod;
+
return false;
}
@@ -2170,6 +2189,8 @@ bool Bind::visit(ClassSpecifierAST *ast)
_type.setType(klass);
Scope *previousScope = switchScope(klass);
+ const int previousVisibility = switchVisibility(Symbol::Public);
+ const int previousMethodKey = switchMethodKey(Function::NormalMethod);
for (BaseSpecifierListAST *it = ast->base_clause_list; it; it = it->next) {
this->baseSpecifier(it->value, ast->colon_token, klass);
@@ -2178,7 +2199,11 @@ bool Bind::visit(ClassSpecifierAST *ast)
for (DeclarationListAST *it = ast->member_specifier_list; it; it = it->next) {
this->declaration(it->value);
}
+
+ (void) switchMethodKey(previousMethodKey);
+ (void) switchVisibility(previousVisibility);
(void) switchScope(previousScope);
+
ast->symbol = klass;
return false;
}
diff --git a/src/shared/cplusplus/Bind.h b/src/shared/cplusplus/Bind.h
index a323bc00b5..e9b5c77b6d 100644
--- a/src/shared/cplusplus/Bind.h
+++ b/src/shared/cplusplus/Bind.h
@@ -79,8 +79,9 @@ protected:
FullySpecifiedType coreDeclarator(CoreDeclaratorAST *ast, const FullySpecifiedType &init);
FullySpecifiedType postfixDeclarator(PostfixDeclaratorAST *ast, const FullySpecifiedType &init);
- Scope *currentScope() const;
Scope *switchScope(Scope *scope);
+ int switchVisibility(int visibility);
+ int switchMethodKey(int methodKey);
const Name *objCSelectorArgument(ObjCSelectorArgumentAST *ast, bool *hasArg);
void attribute(AttributeAST *ast);
@@ -278,6 +279,8 @@ private:
const Name *_name;
FullySpecifiedType _type;
DeclaratorIdAST **_declaratorId;
+ int _visibility;
+ int _methodKey;
};
} // end of namespace CPlusPlus