diff options
author | Erik Verbruggen <erik.verbruggen@nokia.com> | 2010-07-19 10:42:07 +0200 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@nokia.com> | 2010-07-19 10:42:32 +0200 |
commit | 867bf3dae8939bc221f54309256248f6f6e739fd (patch) | |
tree | 701eb57d652f2ee18d908b0fc69a1f0fcfc93e34 /src/shared/cplusplus/CheckDeclaration.cpp | |
parent | 7de836bf851b144ead33a5aea685ed92b9e928ea (diff) | |
download | qt-creator-867bf3dae8939bc221f54309256248f6f6e739fd.tar.gz |
Fixes for scope range calculation.
Diffstat (limited to 'src/shared/cplusplus/CheckDeclaration.cpp')
-rw-r--r-- | src/shared/cplusplus/CheckDeclaration.cpp | 70 |
1 files changed, 59 insertions, 11 deletions
diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp index 3cf8040e39..d0e5600523 100644 --- a/src/shared/cplusplus/CheckDeclaration.cpp +++ b/src/shared/cplusplus/CheckDeclaration.cpp @@ -349,8 +349,8 @@ bool CheckDeclaration::visit(FunctionDefinitionAST *ast) fun->setDeprecated(true); if (ty.isUnavailable()) fun->setUnavailable(true); - fun->setStartOffset(funStartOffset); - fun->setEndOffset(tokenAt(ast->lastToken() - 1).end()); + fun->members()->setStartOffset(funStartOffset); + fun->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end()); if (ast->declarator) fun->setSourceLocation(ast->declarator->firstToken(), translationUnit()); fun->setName(name); @@ -410,13 +410,15 @@ bool CheckDeclaration::visit(NamespaceAST *ast) namespaceName = control()->nameId(id); unsigned sourceLocation = ast->firstToken(); - if (ast->identifier_token) sourceLocation = ast->identifier_token; + unsigned scopeStart = tokenAt(ast->firstToken()).offset; + if (ast->linkage_body && ast->linkage_body->firstToken()) + scopeStart = tokenAt(ast->linkage_body->firstToken()).offset; Namespace *ns = control()->newNamespace(sourceLocation, namespaceName); - ns->setStartOffset(tokenAt(ast->firstToken()).offset); - ns->setEndOffset(tokenAt(ast->lastToken() - 1).end()); + ns->members()->setStartOffset(scopeStart); + ns->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end()); ast->symbol = ns; _scope->enterSymbol(ns); semantic()->check(ast->linkage_body, ns->members()); // ### we'll do the merge later. @@ -583,6 +585,18 @@ bool CheckDeclaration::visit(ObjCProtocolForwardDeclarationAST *ast) return false; } +unsigned CheckDeclaration::calculateScopeStart(ObjCProtocolDeclarationAST *ast) const +{ + if (ast->protocol_refs) + if (unsigned pos = ast->protocol_refs->lastToken()) + return tokenAt(pos - 1).end(); + if (ast->name) + if (unsigned pos = ast->name->lastToken()) + return tokenAt(pos - 1).end(); + + return tokenAt(ast->firstToken()).offset; +} + bool CheckDeclaration::visit(ObjCProtocolDeclarationAST *ast) { unsigned sourceLocation; @@ -593,8 +607,8 @@ bool CheckDeclaration::visit(ObjCProtocolDeclarationAST *ast) const Name *protocolName = semantic()->check(ast->name, _scope); ObjCProtocol *protocol = control()->newObjCProtocol(sourceLocation, protocolName); - protocol->setStartOffset(tokenAt(ast->firstToken()).offset); - protocol->setEndOffset(tokenAt(ast->lastToken() - 1).end()); + protocol->members()->setStartOffset(calculateScopeStart(ast)); + protocol->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end()); if (ast->protocol_refs && ast->protocol_refs->identifier_list) { for (NameListAST *iter = ast->protocol_refs->identifier_list; iter; iter = iter->next) { @@ -642,6 +656,40 @@ bool CheckDeclaration::visit(ObjCClassForwardDeclarationAST *ast) return false; } +unsigned CheckDeclaration::calculateScopeStart(ObjCClassDeclarationAST *ast) const +{ + if (ast->inst_vars_decl) + if (unsigned pos = ast->inst_vars_decl->lbrace_token) + return tokenAt(pos).end(); + + if (ast->protocol_refs) + if (unsigned pos = ast->protocol_refs->lastToken()) + return tokenAt(pos - 1).end(); + + if (ast->superclass) + if (unsigned pos = ast->superclass->lastToken()) + return tokenAt(pos - 1).end(); + + if (ast->colon_token) + return tokenAt(ast->colon_token).end(); + + if (ast->rparen_token) + return tokenAt(ast->rparen_token).end(); + + if (ast->category_name) + if (unsigned pos = ast->category_name->lastToken()) + return tokenAt(pos - 1).end(); + + if (ast->lparen_token) + return tokenAt(ast->lparen_token).end(); + + if (ast->class_name) + if (unsigned pos = ast->class_name->lastToken()) + return tokenAt(pos - 1).end(); + + return tokenAt(ast->firstToken()).offset; +} + bool CheckDeclaration::visit(ObjCClassDeclarationAST *ast) { unsigned sourceLocation; @@ -652,8 +700,8 @@ bool CheckDeclaration::visit(ObjCClassDeclarationAST *ast) const Name *className = semantic()->check(ast->class_name, _scope); ObjCClass *klass = control()->newObjCClass(sourceLocation, className); - klass->setStartOffset(tokenAt(ast->firstToken()).offset); - klass->setEndOffset(tokenAt(ast->lastToken() - 1).end()); + klass->members()->setStartOffset(calculateScopeStart(ast)); + klass->members()->setEndOffset(tokenAt(ast->lastToken() - 1).offset); ast->symbol = klass; klass->setInterface(ast->interface_token != 0); @@ -716,8 +764,8 @@ bool CheckDeclaration::visit(ObjCMethodDeclarationAST *ast) Symbol *symbol; if (ast->function_body) { symbol = methodTy; - methodTy->setStartOffset(tokenAt(ast->firstToken()).offset); - methodTy->setEndOffset(tokenAt(ast->lastToken() - 1).end()); + methodTy->members()->setStartOffset(tokenAt(ast->function_body->firstToken()).offset); + methodTy->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end()); } else { Declaration *decl = control()->newDeclaration(selector->firstToken(), methodTy->name()); decl->setType(methodTy); |