diff options
author | Roberto Raggi <roberto.raggi@nokia.com> | 2010-08-13 15:16:13 +0200 |
---|---|---|
committer | Roberto Raggi <roberto.raggi@nokia.com> | 2010-08-13 15:16:13 +0200 |
commit | f6ac9bd2b2ad1b153d3f77cf58f2e312ad6ad26f (patch) | |
tree | 49ce7d12483cc81b8f9066b379aafbc304c8ce2a /src/shared/cplusplus | |
parent | f2372257cec3dfb63b605c6ee60b3b4d36480b44 (diff) | |
download | qt-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.cpp | 45 |
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; } |