diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp index 817d0e9f7695e2c4563ca58f52435e88594c1159..1e677f85c04e3fb2ca08a754cc5371addfcc979f 100644 --- a/src/libs/cplusplus/CppDocument.cpp +++ b/src/libs/cplusplus/CppDocument.cpp @@ -89,11 +89,11 @@ protected: } unsigned startLine, startColumn; - _unit->getPosition(symbol->startOffset(), &startLine, &startColumn); + _unit->getPosition(scope->startOffset(), &startLine, &startColumn); if (_line > startLine || (_line == startLine && _column >= startColumn)) { unsigned endLine, endColumn; - _unit->getPosition(symbol->endOffset(), &endLine, &endColumn); + _unit->getPosition(scope->endOffset(), &endLine, &endColumn); if (_line < endLine || (_line == endLine && _column <= endColumn)) _scope = scope; diff --git a/src/plugins/cppeditor/cppchecksymbols.cpp b/src/plugins/cppeditor/cppchecksymbols.cpp index cdf8162510f6e409337fcb2389542bab921d92a6..a2681991a3efdefa9602211c012beed7bd36401e 100644 --- a/src/plugins/cppeditor/cppchecksymbols.cpp +++ b/src/plugins/cppeditor/cppchecksymbols.cpp @@ -87,12 +87,12 @@ public: static Scope *findScope(unsigned tokenOffset, const QList<ScopedSymbol *> &scopes) { for (int i = scopes.size() - 1; i != -1; --i) { - ScopedSymbol *symbol = scopes.at(i); - const unsigned start = symbol->startOffset(); - const unsigned end = symbol->endOffset(); + Scope *scope = scopes.at(i)->members(); + const unsigned start = scope->startOffset(); + const unsigned end = scope->endOffset(); if (tokenOffset >= start && tokenOffset < end) - return symbol->members(); + return scope; } return 0; diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp index 3cf8040e39c8d2a2974a0c9cb5a1c8e7dce54d8a..d0e5600523e04ab5ecab582e8d9e84823f75a276 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); diff --git a/src/shared/cplusplus/CheckDeclaration.h b/src/shared/cplusplus/CheckDeclaration.h index d9d8cb0170f8f747260a94b37d0ca5e9043ca78a..acd71c557bdc9f33fe55e36042e4fb1b8d9bdb23 100644 --- a/src/shared/cplusplus/CheckDeclaration.h +++ b/src/shared/cplusplus/CheckDeclaration.h @@ -111,6 +111,9 @@ private: void checkQEnumsQFlagsNames(NameListAST *nameListAst, const char *declName); + unsigned calculateScopeStart(ObjCClassDeclarationAST *ast) const; + unsigned calculateScopeStart(ObjCProtocolDeclarationAST *ast) const; + private: DeclarationAST *_declaration; Scope *_scope; diff --git a/src/shared/cplusplus/CheckSpecifier.cpp b/src/shared/cplusplus/CheckSpecifier.cpp index ce5b6a38e2d5b13c46d1f92c99a0735df32803ef..87ff373eb30a065691418828a11c9e5a45ccdeaf 100644 --- a/src/shared/cplusplus/CheckSpecifier.cpp +++ b/src/shared/cplusplus/CheckSpecifier.cpp @@ -316,8 +316,8 @@ bool CheckSpecifier::visit(ClassSpecifierAST *ast) const Name *className = semantic()->check(ast->name, _scope); Class *klass = control()->newClass(sourceLocation, className); - klass->setStartOffset(classScopeStart); - klass->setEndOffset(tokenAt(ast->lastToken() - 1).end()); + klass->members()->setStartOffset(classScopeStart); + klass->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end()); ast->symbol = klass; unsigned classKey = tokenKind(ast->classkey_token); if (classKey == T_CLASS) @@ -407,8 +407,8 @@ bool CheckSpecifier::visit(EnumSpecifierAST *ast) const Name *name = semantic()->check(ast->name, _scope); Enum *e = control()->newEnum(sourceLocation, name); - e->setStartOffset(scopeStart); - e->setEndOffset(tokenAt(ast->lastToken() - 1).end()); + e->members()->setStartOffset(scopeStart); + e->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end()); e->setVisibility(semantic()->currentVisibility()); _scope->enterSymbol(e); _fullySpecifiedType.setType(e); diff --git a/src/shared/cplusplus/CheckStatement.cpp b/src/shared/cplusplus/CheckStatement.cpp index dd778f7f5eb96e76d06940009ddf3d46a6f38b4f..aa145e804c4ae2250a72632de065403d236b4647 100644 --- a/src/shared/cplusplus/CheckStatement.cpp +++ b/src/shared/cplusplus/CheckStatement.cpp @@ -111,8 +111,8 @@ bool CheckStatement::visit(CaseStatementAST *ast) bool CheckStatement::visit(CompoundStatementAST *ast) { Block *block = control()->newBlock(ast->lbrace_token); - block->setStartOffset(tokenAt(ast->firstToken()).end()); - block->setEndOffset(tokenAt(ast->lastToken() - 1).end()); + block->members()->setStartOffset(tokenAt(ast->firstToken()).end()); + block->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end()); ast->symbol = block; _scope->enterSymbol(block); Scope *previousScope = switchScope(block->members()); @@ -167,6 +167,7 @@ bool CheckStatement::visit(ExpressionStatementAST *ast) } bool CheckStatement::forEachFastEnum(unsigned firstToken, + unsigned lparen, unsigned lastToken, SpecifierListAST *type_specifier_list, DeclaratorAST *declarator, @@ -175,9 +176,13 @@ bool CheckStatement::forEachFastEnum(unsigned firstToken, StatementAST *statement, Block *&symbol) { + unsigned scopeStart = tokenAt(firstToken).offset; + if (lparen) + scopeStart = tokenAt(lparen).end(); + Block *block = control()->newBlock(firstToken); - block->setStartOffset(tokenAt(firstToken).offset); - block->setEndOffset(tokenAt(lastToken - 1).end()); + block->members()->setStartOffset(scopeStart); + block->members()->setEndOffset(tokenAt(lastToken - 1).end()); symbol = block; _scope->enterSymbol(block); Scope *previousScope = switchScope(block->members()); @@ -205,6 +210,7 @@ bool CheckStatement::forEachFastEnum(unsigned firstToken, bool CheckStatement::visit(ForeachStatementAST *ast) { return forEachFastEnum(ast->firstToken(), + ast->lparen_token, ast->lastToken(), ast->type_specifier_list, ast->declarator, @@ -217,6 +223,7 @@ bool CheckStatement::visit(ForeachStatementAST *ast) bool CheckStatement::visit(ObjCFastEnumerationAST *ast) { return forEachFastEnum(ast->firstToken(), + ast->lparen_token, ast->lastToken(), ast->type_specifier_list, ast->declarator, @@ -228,9 +235,13 @@ bool CheckStatement::visit(ObjCFastEnumerationAST *ast) bool CheckStatement::visit(ForStatementAST *ast) { + unsigned scopeStart = tokenAt(ast->firstToken()).offset; + if (ast->lparen_token) + scopeStart = tokenAt(ast->lparen_token).end(); + Block *block = control()->newBlock(ast->for_token); - block->setStartOffset(tokenAt(ast->firstToken()).offset); - block->setEndOffset(tokenAt(ast->lastToken() - 1).end()); + block->members()->setStartOffset(scopeStart); + block->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end()); ast->symbol = block; _scope->enterSymbol(block); Scope *previousScope = switchScope(block->members()); @@ -245,9 +256,13 @@ bool CheckStatement::visit(ForStatementAST *ast) bool CheckStatement::visit(IfStatementAST *ast) { + unsigned scopeStart = tokenAt(ast->firstToken()).offset; + if (ast->lparen_token) + scopeStart = tokenAt(ast->lparen_token).end(); + Block *block = control()->newBlock(ast->if_token); - block->setStartOffset(tokenAt(ast->firstToken()).offset); - block->setEndOffset(tokenAt(ast->lastToken() - 1).end()); + block->members()->setStartOffset(scopeStart); + block->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end()); ast->symbol = block; _scope->enterSymbol(block); Scope *previousScope = switchScope(block->members()); @@ -292,9 +307,13 @@ bool CheckStatement::visit(ReturnStatementAST *ast) bool CheckStatement::visit(SwitchStatementAST *ast) { + unsigned scopeStart = tokenAt(ast->firstToken()).offset; + if (ast->lparen_token) + scopeStart = tokenAt(ast->lparen_token).offset; + Block *block = control()->newBlock(ast->switch_token); - block->setStartOffset(tokenAt(ast->firstToken()).offset); - block->setEndOffset(tokenAt(ast->lastToken() - 1).end()); + block->members()->setStartOffset(scopeStart); + block->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end()); ast->symbol = block; _scope->enterSymbol(block); Scope *previousScope = switchScope(block->members()); @@ -317,9 +336,13 @@ bool CheckStatement::visit(TryBlockStatementAST *ast) bool CheckStatement::visit(CatchClauseAST *ast) { + unsigned scopeStart = tokenAt(ast->firstToken()).offset; + if (ast->lparen_token) + scopeStart = tokenAt(ast->lparen_token).end(); + Block *block = control()->newBlock(ast->catch_token); - block->setStartOffset(tokenAt(ast->firstToken()).offset); - block->setEndOffset(tokenAt(ast->lastToken() - 1).end()); + block->members()->setStartOffset(scopeStart); + block->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end()); ast->symbol = block; _scope->enterSymbol(block); Scope *previousScope = switchScope(block->members()); @@ -332,9 +355,13 @@ bool CheckStatement::visit(CatchClauseAST *ast) bool CheckStatement::visit(WhileStatementAST *ast) { + unsigned scopeStart = tokenAt(ast->firstToken()).offset; + if (ast->lparen_token) + scopeStart = tokenAt(ast->lparen_token).end(); + Block *block = control()->newBlock(ast->while_token); - block->setStartOffset(tokenAt(ast->firstToken()).offset); - block->setEndOffset(tokenAt(ast->lastToken() - 1).end()); + block->members()->setStartOffset(scopeStart); + block->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end()); ast->symbol = block; _scope->enterSymbol(block); Scope *previousScope = switchScope(block->members()); diff --git a/src/shared/cplusplus/CheckStatement.h b/src/shared/cplusplus/CheckStatement.h index b13204fba90e9ea227bbb43ddb1a35a5a8ea2136..3f96a14fdf8d9973115247194a4e63348913a642 100644 --- a/src/shared/cplusplus/CheckStatement.h +++ b/src/shared/cplusplus/CheckStatement.h @@ -92,6 +92,7 @@ protected: virtual bool visit(QtMemberDeclarationAST *ast); bool forEachFastEnum(unsigned firstToken, + unsigned lparen, unsigned lastToken, SpecifierListAST *type_specifier_list, DeclaratorAST *declarator, diff --git a/src/shared/cplusplus/Symbols.cpp b/src/shared/cplusplus/Symbols.cpp index 5d64149360ef44f1e96f2be8d556eabe9b7d31cc..e82a60ae199e92cd9bd25bf0d388412b67f61d6c 100644 --- a/src/shared/cplusplus/Symbols.cpp +++ b/src/shared/cplusplus/Symbols.cpp @@ -427,18 +427,6 @@ Scope *ScopedSymbol::members() const void ScopedSymbol::addMember(Symbol *member) { _members->enterSymbol(member); } -unsigned ScopedSymbol::startOffset() const -{ return _members->startOffset(); } - -void ScopedSymbol::setStartOffset(unsigned offset) -{ _members->setStartOffset(offset); } - -unsigned ScopedSymbol::endOffset() const -{ return _members->endOffset(); } - -void ScopedSymbol::setEndOffset(unsigned offset) -{ _members->setEndOffset(offset); } - Block::Block(TranslationUnit *translationUnit, unsigned sourceLocation) : ScopedSymbol(translationUnit, sourceLocation, /*name = */ 0) { } diff --git a/src/shared/cplusplus/Symbols.h b/src/shared/cplusplus/Symbols.h index 05a1241ec405d33df726bd9f54880ca21e17425c..2a90fd0cc0306b5712e4f9385fea450129a1d67b 100644 --- a/src/shared/cplusplus/Symbols.h +++ b/src/shared/cplusplus/Symbols.h @@ -234,14 +234,6 @@ public: virtual ScopedSymbol *asScopedSymbol() { return this; } - /// Set the start offset of the scope for this symbol - unsigned startOffset() const; - void setStartOffset(unsigned offset); - - /// Set the end offset of the scope for this symbol - unsigned endOffset() const; - void setEndOffset(unsigned offset); - private: Scope *_members; };