summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus/CheckDeclaration.cpp
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@nokia.com>2010-07-19 10:42:07 +0200
committerErik Verbruggen <erik.verbruggen@nokia.com>2010-07-19 10:42:32 +0200
commit867bf3dae8939bc221f54309256248f6f6e739fd (patch)
tree701eb57d652f2ee18d908b0fc69a1f0fcfc93e34 /src/shared/cplusplus/CheckDeclaration.cpp
parent7de836bf851b144ead33a5aea685ed92b9e928ea (diff)
downloadqt-creator-867bf3dae8939bc221f54309256248f6f6e739fd.tar.gz
Fixes for scope range calculation.
Diffstat (limited to 'src/shared/cplusplus/CheckDeclaration.cpp')
-rw-r--r--src/shared/cplusplus/CheckDeclaration.cpp70
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);