diff --git a/src/shared/cplusplus/Bind.cpp b/src/shared/cplusplus/Bind.cpp index c47878a4c8b1806faf381861719c2f12e6da452e..cbb492f32b71f8e162dd98f7c945077d0722696e 100644 --- a/src/shared/cplusplus/Bind.cpp +++ b/src/shared/cplusplus/Bind.cpp @@ -1073,6 +1073,8 @@ bool Bind::visit(CaseStatementAST *ast) bool Bind::visit(CompoundStatementAST *ast) { Block *block = control()->newBlock(ast->firstToken()); + block->setStartOffset(tokenAt(ast->firstToken()).begin()); + block->setEndOffset(tokenAt(ast->lastToken() - 1).end()); ast->symbol = block; _scope->addMember(block); Scope *previousScope = switchScope(block); @@ -1799,6 +1801,8 @@ bool Bind::visit(NamespaceAST *ast) } Namespace *ns = control()->newNamespace(sourceLocation, namespaceName); + ns->setStartOffset(tokenAt(sourceLocation).end()); // the scope starts after the namespace or the identifier token. + ns->setEndOffset(tokenAt(ast->lastToken() - 1).end()); ast->symbol = ns; _scope->addMember(ns); @@ -1863,6 +1867,8 @@ bool Bind::visit(ParameterDeclarationAST *ast) bool Bind::visit(TemplateDeclarationAST *ast) { Template *templ = control()->newTemplate(ast->firstToken(), 0); + templ->setStartOffset(tokenAt(ast->firstToken()).begin()); + templ->setStartOffset(tokenAt(ast->lastToken() - 1).end()); ast->symbol = templ; Scope *previousScope = switchScope(templ); @@ -2348,7 +2354,8 @@ bool Bind::visit(TypeofSpecifierAST *ast) bool Bind::visit(ClassSpecifierAST *ast) { // unsigned classkey_token = ast->classkey_token; - unsigned sourceLocation = ast->classkey_token; + unsigned sourceLocation = ast->firstToken(); + unsigned startScopeOffset = tokenAt(sourceLocation).end(); // at the end of the class key for (SpecifierListAST *it = ast->attribute_list; it; it = it->next) { _type = this->specifier(it->value, _type); @@ -2358,14 +2365,19 @@ bool Bind::visit(ClassSpecifierAST *ast) if (ast->name) { sourceLocation = ast->name->firstToken(); + startScopeOffset = tokenAt(sourceLocation).end(); // at the end of the class name if (QualifiedNameAST *q = ast->name->asQualifiedName()) { - if (q->unqualified_name) + if (q->unqualified_name) { sourceLocation = q->unqualified_name->firstToken(); + startScopeOffset = tokenAt(q->unqualified_name->lastToken() - 1).end(); // at the end of the unqualified name + } } } Class *klass = control()->newClass(sourceLocation, className); + klass->setStartOffset(startScopeOffset); + klass->setEndOffset(tokenAt(ast->lastToken() - 1).end()); _scope->addMember(klass); _type.setType(klass); @@ -2414,6 +2426,8 @@ bool Bind::visit(EnumSpecifierAST *ast) const Name *enumName = this->name(ast->name); Enum *e = control()->newEnum(sourceLocation, enumName); + e->setStartOffset(tokenAt(sourceLocation).end()); // at the end of the enum or identifier token. + e->setEndOffset(tokenAt(ast->lastToken() - 1).end()); ast->symbol = e; _scope->addMember(e); @@ -2530,6 +2544,8 @@ bool Bind::visit(NestedDeclaratorAST *ast) bool Bind::visit(FunctionDeclaratorAST *ast) { Function *fun = control()->newFunction(0, 0); + fun->setStartOffset(tokenAt(ast->firstToken()).begin()); + fun->setEndOffset(tokenAt(ast->lastToken() - 1).end()); fun->setReturnType(_type); // unsigned lparen_token = ast->lparen_token;