summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2010-08-13 15:16:13 +0200
committerRoberto Raggi <roberto.raggi@nokia.com>2010-08-13 15:16:13 +0200
commitf6ac9bd2b2ad1b153d3f77cf58f2e312ad6ad26f (patch)
tree49ce7d12483cc81b8f9066b379aafbc304c8ce2a /src/shared/cplusplus
parentf2372257cec3dfb63b605c6ee60b3b4d36480b44 (diff)
downloadqt-creator-f6ac9bd2b2ad1b153d3f77cf58f2e312ad6ad26f.tar.gz
Process switch statements and handle Q/D pointers.
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r--src/shared/cplusplus/Bind.cpp45
1 files changed, 35 insertions, 10 deletions
diff --git a/src/shared/cplusplus/Bind.cpp b/src/shared/cplusplus/Bind.cpp
index f9c20e7ac9..7ee2d8cf1b 100644
--- a/src/shared/cplusplus/Bind.cpp
+++ b/src/shared/cplusplus/Bind.cpp
@@ -1088,18 +1088,38 @@ FullySpecifiedType Bind::trailingReturnType(TrailingReturnTypeAST *ast, const Fu
// StatementAST
bool Bind::visit(QtMemberDeclarationAST *ast)
{
- // unsigned q_token = ast->q_token;
- // unsigned lparen_token = ast->lparen_token;
- ExpressionTy type_id = this->expression(ast->type_id);
- // unsigned rparen_token = ast->rparen_token;
+ const Name *name = 0;
+
+ if (tokenKind(ast->q_token) == T_Q_D)
+ name = control()->nameId(control()->identifier("d"));
+ else
+ name = control()->nameId(control()->identifier("q"));
+
+ FullySpecifiedType declTy = this->expression(ast->type_id);
+
+ if (tokenKind(ast->q_token) == T_Q_D) {
+ if (NamedType *namedTy = declTy->asNamedType()) {
+ if (const NameId *nameId = namedTy->name()->asNameId()) {
+ std::string privateClass;
+ privateClass += nameId->identifier()->chars();
+ privateClass += "Private";
+
+ const Name *privName = control()->nameId(control()->identifier(privateClass.c_str(), privateClass.size()));
+ declTy.setType(control()->namedType(privName));
+ }
+ }
+ }
+
+ Declaration *symbol = control()->newDeclaration(/*generated*/ 0, name);
+ symbol->setType(control()->pointerType(declTy));
+
+ _scope->addMember(symbol);
return false;
}
bool Bind::visit(CaseStatementAST *ast)
{
- // unsigned case_token = ast->case_token;
ExpressionTy expression = this->expression(ast->expression);
- // unsigned colon_token = ast->colon_token;
this->statement(ast->statement);
return false;
}
@@ -1257,12 +1277,17 @@ bool Bind::visit(ReturnStatementAST *ast)
bool Bind::visit(SwitchStatementAST *ast)
{
- // unsigned switch_token = ast->switch_token;
- // unsigned lparen_token = ast->lparen_token;
+ Block *block = control()->newBlock(ast->firstToken());
+ const unsigned startScopeToken = ast->lparen_token ? ast->lastToken() : ast->firstToken();
+ block->setStartOffset(tokenAt(startScopeToken).end());
+ block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
+ _scope->addMember(block);
+ ast->symbol = block;
+
+ Scope *previousScope = switchScope(block);
ExpressionTy condition = this->expression(ast->condition);
- // unsigned rparen_token = ast->rparen_token;
this->statement(ast->statement);
- // Block *symbol = ast->symbol;
+ (void) switchScope(previousScope);
return false;
}